2010-10-20 6 views
7

W PHP można używać zmiennych zmiennych ...Jak sprawdzić, czy ciąg znaków może być używany jako nazwa zmiennej w PHP?

Na przykład ...

class obj { } 
$fieldName = "Surname"; 
$object = new obj(); 
$object->Name = "John"; 
$object->$fieldName = "Doe"; 
echo "{$object->Name} {$object->Surname}"; // This echoes "John Doe". 

Jednak $ fieldName ciąg może zawierać niektóre znaki nie dozwolone w nazwach zmiennych. PHP nadal utworzy pole o tej nazwie (podobnie jak tablica asocjacyjna), ale nie będę mógł uzyskać do niego dostępu za pomocą $ object -> ...... ponieważ nie będzie on poprawnie analizowany.

Teraz jest jakaś funkcja, która może sprawdzić, czy ciąg znaków może być używany jako poprawną nazwą zmiennej PHP. Jeśli nie, w jaki sposób byłoby to tworzone za pomocą wyrażeń regularnych? Jakie są zasady dotyczące nazw zmiennych w PHP?

+1

Chociaż możesz zdecydowanie to zrobić, to jest to zły pomysł, aby przyjąć takie podejście ze zmiennymi. – Fosco

+0

* (powiązane) * [Nazwy egzotyczne dla metod, stałych, zmiennych i pól] (http://stackoverflow.com/questions/3417180/exotic-names-for-methods-constants-variables-and-fields-bug-or -feature "Omów dlaczego PHP pozwala $ ☂ = 1 lub nawet $ {"} = 1 dla nazw zmiennych ") – Gordon

Odpowiedz

15

Od the manual:

Nazwy zmiennych według tych samych zasad jak inne etykiety w PHP. Prawidłowa nazwa zmiennej rozpoczyna się od litery lub podkreślenia, po którym następuje dowolna liczba liter, cyfr lub podkreśleń. Jako wyrażenie regularne, to być wyrażone w następujący sposób: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

Więc jeśli prowadził swój ciąg poprzez regex, powinieneś być w stanie powiedzieć, czy jest poprawny, czy nie.

Należy zauważyć, że możliwość dostępu do nazwy „nieważny” właściwości obiektu przy użyciu zmiennej zmienna jest prawidłowe podejście do niektórych analizowania XML.

Na przykład, z SimpleXML docs:

dostęp do elementów w dokumencie XML, który zawiera znaki nie dozwolone na mocy konwencji nazewnictwa PHP (np łącznik) można osiągnąć przez umieszczenie nazwy elementu wewnątrz szelki i tym apostrof.

Obserwowani przez tym przykładzie kodu:

echo $xml->movie->{'great-lines'}->line; 

Więc to nie jest koniecznie źle mieć właściwości, które mogą być dostępne tylko w ten sposób.

Jednakże, jeśli kod zarówno tworzy i używa obiektu - można by się zastanawiać, dlaczego byłoby użyć tych rodzaju właściwości. Zezwalając oczywiście na sytuację podobną do przykładu SimpleXML, gdzie obiekt jest tworzony, aby reprezentować coś poza zakresem kontroli.

+0

Dlaczego echo preg_match ('/ [a-zA-Z_ \ x7f- \ xff] [a-zA- Z0-9_ \ x7f- \ xff] */', ".1master"); drukuje 1? Jak przyjmuje kropkę? –

+0

@kornelijepetak, ponieważ 'preg_match' szuka dopasowania, nie sprawdza poprawności całego łańcucha znaków. Użyj '/^[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] * $ /', aby wymusić dopasowanie na cały ciąg. –

+0

Nie rozumiem, dlaczego używa się \ x7f- \ xff? Czy ktoś może to wyjaśnić? –

-1

myślę regex jest droga, a ile pamiętam ograniczenia to:

  • alfanumeryczny
  • musi zaczynać się od litery
  • może zawierać znaku podkreślenia

, więc wyrażenie regularne będzie "/ [a-zA-Z] + [0-9a-zA-Z _] * /" - z góry mojej głowy, aby Twój przebieg mógł się różnić.

1

Jednak, `$ fieldName ciąg może zawierać niektóre znaki nie dozwolone w nazwach zmiennych. PHP nadal utworzy pole o tej nazwie (podobnie jak tablica asocjacyjna), ale nie będę mógł uzyskać do niego dostępu za pomocą $ object -> ...... ponieważ nie będzie on poprawnie analizowany.

Nadal będzie można uzyskać dostęp do pola za pomocą składni $object->{"fieldname"}.

Z tego co wiem, jedynym ograniczeniem jest to, że nie można uzyskać dostępu do właściwości za pomocą \x00 w nazwie i nie można zdefiniować zmiennych rozpoczynających się od \x00.

Przykład:

$a = new stdclass; 
$a->{"\x00dd"} = 8; //invalid 
$a->{"dd\x00dd"} = 8; //valid, but... 
echo $a->{"dd\x00dd"}; //can't read (no property "dd") 
+0

Zabawne. Ten kod faktycznie działa w PHP 4. – webbiedave

+0

@web Prawdopodobnie dlatego, że do zaimplementowania własności prywatnych użyto znaków zerowych i zostały one wprowadzone tylko w PHP 5. – Artefacto

1

ale nie będzie mógł uzyskać do niego dostęp z $ object -> ...... bo to nie przetwarza poprawnie

ale wygląd:

class A {} 

$varName = '!asd asd'; 
$a = new A(); 
$a->$varName = '1'; 
echo "{$a->{'!asd asd'}}"; // 1 

Z pewnością nie jest zalecane, ale jest to można wykonać.

5

Jak już odpowiedział, ale nie z kompletną linię kodu:

if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/','evaluation string')) 
{ 
    // the string is valid 
} 
else 
{ 
    // the string is not valid 
} 
0

Sprawdzanie poprawności z RegEx jeśli chciał pozwolić $ lub &$ (przekazać zmienną przez odniesienie) zostać zatwierdzone w ciągu, możesz użyć tego wyrażenia:

/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/ 
Powiązane problemy