Это ошибка переменной php? - PullRequest
14 голосов
/ 23 июля 2010

Есть ли логическое объяснение этому?

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

Ответы [ 5 ]

12 голосов
/ 23 июля 2010

Когда вы делаете

$$a = 'foo';

, вы говорите, взять значение $a.Преобразуйте это в строку.Используйте String как имя переменной, чтобы присвоить ей 'foo'.Поскольку $a не определено и возвращает NULL, что при типизированном параметре String равно '', вы присваиваете переменную ${''};

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

По иронии судьбы вы можете сделать

${''} = 'foo'; /* but not */ $ = 'foo';

И вы можете сделать

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

, который вызовет уведомление о том, что $x не определен, но затем выдаст Hello World.Как ни странно, следующее не работает:

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

Поскольку это вызывает Неустранимая ошибка: Имя функции должно быть строкой .Причудливый: D

Поскольку в руководстве по PHP написано

Имена переменных следуют тем же правилам, что и другие метки в PHP.Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркиваний.

Я бы посчитал, что возможность присвоить пустую именованную переменную действительно ошибка.

Для этого уже есть несколько связанных ошибок:

8 голосов
/ 23 июля 2010

если вы попробуете

<code>$$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 ) . "
");

Вы можете видеть, что она зарегистрировала переменную без имени, так что да, согласно соглашениям об именах PHP, это будет ошибкой

2 голосов
/ 23 июля 2010

Держу пари, что она определяет переменную как нечто с эффектом ${''}, или переменную без имени, или что-то в этом роде.

Поскольку ни $a, ни $aa, ни $aaa не определены, все они указывают на одно и то же непонятное пустое имя переменной при использовании в контексте переменной переменной.

1 голос
/ 23 июля 2010

Вы не правильно поняли, рассмотрите это:

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

Выход:

hello again

В вашем случае вы не установили значение следующих переменных, поэтому оно выдает то же самое.

Пояснение:

Когда вы делаете $$a, это означает:

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

Так становится:

$hello

Чье значение:

hello again
1 голос
/ 23 июля 2010

Ну, если $ a пусто, тогда вы устанавливаете пустое имя переменной = 'hello world' ... Так что каждый раз, когда вы ссылаетесь на это пустое имя переменной, вы получаете то, что там хранится ...

Это так же, как

$a = '';
$$a = 'Foo Bar';
$b = '';
echo $$b; //Displays Foo Bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...