2010-10-20 12 views
7

En PHP se pueden usar variables variables ...¿Cómo comprobar si una cadena se puede utilizar como un nombre de variable en PHP?

Por ejemplo ...

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

Sin embargo, string $ fieldName puede contener algunos caracteres no permitidos en los nombres de variables. PHP aún creará el campo con ese nombre (al igual que la matriz asociativa), pero no podré acceder a él con $ object -> ...... porque no se analizará correctamente.

Ahora, ¿hay alguna función que pueda verificar si la cadena se puede usar como un nombre válido de variable de PHP. Si no, ¿cómo se crearía esto usando expresiones regulares? ¿Cuáles son las reglas para nombres de variables en PHP?

+1

Si bien definitivamente puede hacerlo, es probable que sea un mal diseño tomar este enfoque con variables. – Fosco

+0

* (relacionado) * [Nombres exóticos para métodos, constantes, variables y campos] (http://stackoverflow.com/questions/3417180/exotic-names-for-methods-constants-variables-and-fields-bug-or -feature "Discute por qué PHP permite $ ☂ = 1 o incluso $ {''} = 1 para nombres de variables") – Gordon

Respuesta

15

De the manual:

nombres de variables siguen las mismas reglas que los demás etiquetas de PHP. Un nombre de variable válido comienza con una letra o guión bajo, seguido de cualquier número de letras, números o guiones bajos. Como una expresión regular, que se expresaría así: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

Así que si se ejecutó la cadena a través de la expresión regular, usted debería ser capaz de decir si es válido o no.

Debe tenerse en cuenta que la capacidad de acceder a nombres de propiedades de objetos 'no válidos' utilizando una variable variable es el enfoque correcto para algunos análisis XML.

Por ejemplo, a partir de los SimpleXML docs:

elementos dentro de un documento XML que contiene caracteres no permitidos bajo convención de nomenclatura de PHP (por ejemplo, el guión) Acceso puede lograrse encapsulando el nombre del elemento dentro de tirantes y la apóstrofe.

Seguido de este ejemplo de código:

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

así que no es necesariamente malo que tienen propiedades que sólo se puede acceder de esta manera.

Sin embargo, si su código crea y usa el objeto, uno se preguntará por qué usaría ese tipo de propiedades. Permitiendo, por supuesto, una situación similar al ejemplo SimpleXML, donde se crea un objeto para representar algo que está fuera del alcance de su control.

+0

¿Por qué echo preg_match ('/ [a-zA-Z_ \ x7f- \ xff] [a-zA- Z0-9_ \ x7f- \ xff] */', ".1master"); imprime 1? ¿Cómo acepta el punto? –

+0

@kornelijepetak porque 'preg_match' busca una coincidencia, no valida la cadena completa. Utilice '/^[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] * $ /' para forzar la coincidencia para que sea la cadena completa. –

+0

No entiendo por qué \ x7f- \ xff se usa aquí? ¿Alguien puede explicarlo? –

-1

Creo expresión regular es el camino a seguir, y por lo que puedo recordar que las restricciones:

  • alfanumérica
  • debe comenzar con una letra
  • puede contener un guión

por lo que la expresión regular sería "/ [a-zA-Z] + [0-9a-zA-Z _] * /" - fuera de la parte superior de mi cabeza para que tu kilometraje pueda variar.

1

Sin embargo, `$ fieldName cadena puede contener algunos caracteres no permitidos en nombres de variable. PHP aún creará el campo con ese nombre (al igual que la matriz asociativa), pero no podré acceder a él con $ object -> ...... porque no se analizará correctamente.

Aún podrá acceder al campo a través de la sintaxis $object->{"fieldname"}.

Hasta donde yo sé, la única restricción es que no puede acceder a las propiedades con \x00 en el nombre y no puede definir variables comenzando con \x00.

Ejemplo:

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

Gracioso. Este código realmente funciona en PHP 4. – webbiedave

+0

@web Eso es probablemente porque los caracteres nulos se usan para implementar propiedades privadas y solo se introdujeron en PHP 5. – Artefacto

1

pero no voy a ser capaz de acceder a él con objeto $ -> ...... porque sería no analizar correctamente

pero mira:

class A {} 

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

Sin duda no es recomendable pero puede hacerse.

5

Como ya se ha respondido, pero no con una completa línea de código:

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

Validación con expresiones regulares si desea permitir que $ o &$ (pasan variable por referencia) para ser validado en la cadena, puede usar esta expresión regular:

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