2010-07-23 2 views
13

Есть ли логическое объяснение этому?Является ли это переменной переменной переменной?

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

Это, вероятно, поведение – Dami

+0

PHP 5.3 Нет это не так, он не получает это право. – Sarfraz

+0

Спасибо всем. Другими словами, это имеет смысл. echo $ {null}; действительно. – Dami

ответ

7

если вы пытаетесь

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

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

+0

, так что противоречит соглашению об именах php, переменная может быть нулевой или пустой строкой – Dami

+0

Я думаю, он ссылается на соглашения об именах для самого имени переменной. '$ var' - это переменная, но' $ 'is not ... –

+0

Я не уверен, что делает эту ошибку. Это определенно не очень хорошая практика, и я бы хотел, чтобы PHP по умолчанию предупреждал о таких вещах, но поведение последовательное. – Matchu

2

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

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

1

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

это так же, как

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

Вы не получаете это правильно, считают это:

$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 
+0

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

12

При выполнении

$$a = 'foo'; 

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

echo ${''}; // '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 руководство говорит

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.

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

Существует несколько связанных с ошибкой, поданной для этого уже:

+1

Не уверен, что это ирония, разве это не то, чего вы ожидаете? Разве это не говорит больше о том, как работает парсер, поскольку он распознает только явные объявления пустой строки. Отказ от ответственности: я ничего не знаю о php. – Grantismo

+0

@Grantismo Я бы ожидал, что PHP не позволит мне делать $ {''} = 'foo', когда я не могу сделать $ = 'foo', и в руководстве указано, что переменные должны иметь имя. Кроме того, общий способ назначения переменных без фигурных скобок. Но да, заставляет вас задуматься о парсере :) – Gordon

Смежные вопросы