variable tipos tipo texto simples funciones forzado dobles dentro definir convertir concatenar con comillas caracteres cadena agregar php

tipos - ¿Cuáles son los caracteres válidos en los nombres de variable, método, clase, etc. de PHP?



php concat variables (2)

¿Cuáles son los caracteres válidos que puede usar en los nombres de PHP para variables, constantes, funciones, métodos, clases, ...?

El manual tiene some mentions de la expresión regular [a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]* . ¿Cuándo se aplica esta restricción y cuándo no?


La regex [a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]* solo se aplica cuando el nombre se usa directamente en algún elemento sintáctico especial. Algunos ejemplos:

$varName // <-- varName needs to satisfy the regex $foo->propertyName // <-- propertyName needs to satisfy the regex class ClassName {} // <-- ClassName needs to satisfy the regex // and can''t be a reserved keyword

Tenga en cuenta que esta expresión regular se aplica byte por byte, sin tener en cuenta la codificación. Es por eso que también permite muchos nombres raros de Unicode .

Pero la expresión regular restringe solo estos usos "directos" de los nombres. A través de varias características dinámicas, PHP proporciona que es posible usar nombres virtualmente arbitrarios.

En general, no debe hacer suposiciones sobre qué nombres de caracteres pueden contener PHP. Para la mayoría de las partes son simplemente cadenas arbitrarias. Hacer cosas como "validar si algo es un nombre de clase válido" no tiene sentido en PHP.

A continuación, proporcionaré ejemplos de cómo puede crear nombres extraños para las diferentes categorías.

Variables

Los nombres de variables pueden ser cadenas arbitrarias:

${''''} = ''foo''; echo ${''''}; // foo ${"/0"} = ''bar''; echo ${"/0"}; // bar

Constantes

Las constantes globales también pueden ser cadenas arbitrarias:

define('''', ''foo''); echo constant(''''); // foo define("/0", ''bar''); echo constant("/0"); // bar

No hay forma de definir dinámicamente las constantes de clase de las que tengo conocimiento, por lo que no pueden ser arbitrarias. La única forma de crear constantes de clase extrañas parece ser a través del código de extensión.

Propiedades

Las propiedades no pueden ser la cadena vacía y no pueden comenzar con un byte NUL, pero aparte de esto son arbitrarias:

$obj = new stdClass; $obj->{''''} = ''foo''; // Fatal error: Cannot access empty property $obj->{"/0"} = ''foo''; // Fatal error: Cannot access property started with ''/0'' $obj->{''*''} = ''foo''; echo $obj->{''*''}; // foo

Métodos

Los nombres de los métodos son arbitrarios y pueden ser manejados por __call magic:

class Test { public function __call($method, $args) { echo "Called method /"$method/""; } } $obj = new Test; $obj->{''''}(); // Called method "" $obj->{"/0"}(); // Called method "/0"

Las clases

Los nombres de clase arbitrarios se pueden crear usando class_alias con la excepción de la cadena vacía:

class Test {} class_alias(''Test'', ''''); $className = ''''; $obj = new $className; // Fatal error: Class '''' not found class_alias(''Test'', "/0"); $className = "/0"; $obj = new $className; // Works!

Funciones

No conozco una forma de crear nombres de funciones arbitrarios desde el país de usuarios, pero todavía hay ocasiones en que el código interno produce nombres "extraños":

var_dump(create_function('''','''')); // string(9) "/0lambda_1"


NikiC tiene todas ellas excepto funciones. Con las funciones variables puedes tener el nombre que quieras, aunque la sintaxis apesta.

${''=^^=''}=function(){ echo "Hello Kitty!"; }; ${''=^^=''}(); //outputs "Hello Kitty!"