2010-10-20 8 views
7

In PHP si può utilizzare le variabili variabili ...Come verificare se una stringa può essere utilizzata come nome di variabile in PHP?

Per esempio ...

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

Tuttavia, string $ fieldName può contenere alcuni caratteri non consentiti in nomi di variabili. PHP creerà ancora il campo con quel nome (proprio come l'array associativo), ma non potrò accedervi con $ object -> ...... perché non verrebbe analizzato correttamente.

Ora, c'è qualche funzione che può controllare se la stringa può essere usata come un nome di variabile PHP valido. In caso contrario, come sarebbe stato creato utilizzando le espressioni regolari? Quali sono le regole per i nomi delle variabili in PHP?

+1

Mentre è possibile farlo definitivamente, è probabile che un cattivo progetto segua questo approccio con le variabili. – Fosco

+0

* (correlato) * [Nomi esotici per metodi, costanti, variabili e campi] (http://stackoverflow.com/questions/3417180/exotic-nome-for-methods-ststants-variables-and-fields-bug-or -funzione "Spiega perché PHP consente $ ☂ = 1 o anche $ {''} = 1 per i nomi delle variabili") – Gordon

risposta

15

Da the manual:

I nomi delle variabili seguono le stesse regole di altre etichette in PHP. Un nome di variabile valido inizia con una lettera o underscore, seguito da un numero qualsiasi di lettere, numeri o caratteri di sottolineatura. Come un'espressione regolare, si sarebbe espresso così: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

Quindi, se è stato eseguito la stringa attraverso il RegEx, si dovrebbe essere in grado di dire se è valido o meno.

Si noti che la possibilità di accedere ai nomi di proprietà Object "non validi" utilizzando una variabile variabile rappresenta l'approccio corretto per l'analisi XML.

Ad esempio, dalle SimpleXML documenti:

elementi all'interno di un documento XML contenenti caratteri non consentiti convenzione di denominazione di PHP (ad esempio il trattino) Accesso può essere realizzato incapsulando il nome elemento all'interno bretelle e la apostrofo.

Seguito da questo esempio di codice:

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

quindi non è necessariamente sbagliato per avere proprietà che possono essere raggiunte solo in questo modo.

Tuttavia, se il codice crea e utilizza l'oggetto, ci si potrebbe chiedere perché si utilizzerebbe questo tipo di proprietà. Consentendo, ovviamente, una situazione simile all'esempio SimpleXML, in cui viene creato un oggetto per rappresentare qualcosa che non rientra nell'ambito del controllo.

+0

Perché echo preg_match ('/ [a-zA-Z_ \ x7f- \ xff] [a-zA- Z0-9_ \ x7f- \ xff] */', ".1master"); stampa 1? Come accetta il punto? –

+0

@kornelijepetak perché 'preg_match' sta cercando una corrispondenza, non sta convalidando l'intera stringa. Usa '/^[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] * $ /' per forzare la corrispondenza a essere l'intera stringa. –

+0

Non capisco perché \ x7f- \ xff sia usato qui? Qualcuno può spiegarlo? –

-1

Penso regex è la strada da percorrere, e, per quanto posso ricordare le restrizioni sono:

  • alfanumerico
  • deve iniziare con una lettera
  • può contenere un carattere di sottolineatura

in modo che la regex sarebbe "/ [a-zA-Z] + [0-9a-zA-Z _] * /" - dalla parte superiore della mia testa in modo che la tua milage possa variare.

1

Tuttavia, `$ fieldName stringa potrebbe contenere alcuni caratteri non consentiti nei nomi di variabili. PHP creerà ancora il campo con quel nome (proprio come l'array associativo), ma non potrò accedervi con $ object -> ...... perché non verrebbe analizzato correttamente.

Sarà ancora possibile accedere al campo tramite la sintassi $object->{"fieldname"}.

Per quanto ne so, l'unica limitazione è che non è possibile accedere alle proprietà con \x00 nel nome e non è possibile definire le variabili che iniziano con \x00.

Esempio:

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

Divertente. Questo codice funziona in realtà in PHP 4. – webbiedave

+0

@web Probabilmente perché i caratteri null vengono utilizzati per implementare proprietà private e sono stati introdotti solo in PHP 5. – Artefacto

1

ma non sarò in grado di accedervi con $ oggetto -> ...... perché sarebbe non analizzare correttamente

ma guarda:

class A {} 

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

Certamente non consigliato ma è può essere fatto.

5

Come è stato già risposto, ma non con una linea completa di codice:

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

Validazione con RegEx se si voleva consentire $ o &$ (passano variabile per riferimento) che devono essere convalidate nella stringa, è possibile utilizzare questo regex:

/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/ 
Problemi correlati