2010-07-23 18 views
13

¿Hay una explicación lógica para esto?Es esto un error la variable php?

<?php 
$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 
?> 
+0

Esto es probablemente un comportamiento de PHP 5.3 – Dami

+0

No, no es, no está haciendo bien. – Sarfraz

+0

Gracias a todos. Esto tiene sentido ahora, en otras palabras. echo $ {null}; es válido también. – Dami

Respuesta

7

si intenta

$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 


die("<pre>" . print_r(get_defined_vars(), true) . "</pre>"); 

se puede ver que se ha registed una variable sin nombre así que sí, de acuerdo con las convenciones de nombres de PHP, esto sería una error

+0

tan contrario a la convención de nomenclatura de php, una variable puede ser nula, o una cadena vacía – Dami

+0

Creo que se refiere a las convenciones de nomenclatura para el nombre de la variable en sí. '$ var' es una variable, pero' $ 'no es ... –

+0

No estoy seguro de qué es esto un error. Definitivamente no es una buena práctica, y me gustaría que PHP generara advertencias sobre este tipo de cosas de manera predeterminada, pero el comportamiento es constante. – Matchu

2

apuesto a que está definiendo la variable como algo en el sentido de ${''}, o una variable que no tiene nombre, o algo por el estilo.

Dado que ni $a ni $aa ni $aaa se definen, todos ellos apuntan a la misma, nombre de la variable en blanco cobardes cuando se utiliza en un contexto variable de variable.

1

Bueno, si $ a está vacío, entonces se está configurando un nombre de variable vacío a 'hola mundo' = ... De manera que cada vez que hace referencia que desembocan nombre de la variable, obtendrá lo que se almacena allí .. .

es como

$a = ''; 
$$a = 'Foo Bar'; 
$b = ''; 
echo $$b; //Displays Foo Bar 
1

No está recibiendo bien, considere esto:

$a = 'hello'; 
$hello = "hello again"; 
echo $$a; 

Salida:

hello again 

En su caso, usted no ha ajustado el valor de las variables, por lo que da salida a la mismo.

Explicación:

Al hacer $$a, significa:

$       $a; 
^       ^
$ used for php vars   means a's value that is hello 

Por lo tanto, se convierte en:

$hello 

cuyo valor es:

hello again 
+0

Entiendo la variable variable, me divierte que pueda haber una variable sin nombre, o una variable con nulo o una cadena vacía establecida como su nombre. – Dami

12

Al hacer

$$a = 'foo'; 

que está diciendo tomar el valor de $a. Convierta a cadena. Utilice la cadena como nombre de variable para asignar 'foo' a ella.Dado que $a no está definido y devuelve NULL, que cuando se escribe en Cadena es '', está asignando la variable ${''};

echo ${''}; // 'foo' 

Irónicamente, puede hacerlo

Y puede hacerlo

${''} = function() { return func_get_arg(0); }; 
echo ${''}('Hello World'); 
// or 
echo $$x('Hello World'); 

lo que desencadenaría un aviso sobre $x siendo indefinida, pero la salida Hello World a continuación. Curiosamente, el siguiente no funciona:

${''} = function() { return func_get_arg(0); }; 
echo $x('Hello World'); 

, ya que provoca Fatal error: Nombre de la función debe ser una cadena. Peculiar: D

Desde el manual de PHP dice

Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.

lo consideraría ser capaz de asignar una variable llamada vacía un error de hecho.

hay un error de alguna manera relacionado presentada por esto ya:

+1

No estoy seguro si eso es ironía, ¿no es eso exactamente lo que esperarías? ¿Eso no habla más de cómo funciona el analizador, en el sentido de que solo reconoce las declaraciones explícitas de una cadena vacía? Descargo de responsabilidad: no sé nada sobre php. – Grantismo

+0

@Grantismo Espero que PHP me impida hacer $ {''} = 'foo' cuando tampoco puedo hacer $ = 'foo' y el manual indica que las variables deben tener un nombre. Además, la forma común de asignar variables es sin llaves. Pero sí, hace que te preguntes sobre el analizador :) – Gordon

Cuestiones relacionadas