Есть ли логическое объяснение этому?Является ли это переменной переменной переменной?
<?php
$$a = 'hello world';
echo $$a; //displays hello world
echo $$aa; //displays hello world
echo $$aaa; //displays hello world
?>
Есть ли логическое объяснение этому?Является ли это переменной переменной переменной?
<?php
$$a = 'hello world';
echo $$a; //displays hello world
echo $$aa; //displays hello world
echo $$aaa; //displays hello world
?>
если вы пытаетесь
$$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, это будет ошибка
, так что противоречит соглашению об именах php, переменная может быть нулевой или пустой строкой – Dami
Я думаю, он ссылается на соглашения об именах для самого имени переменной. '$ var' - это переменная, но' $ 'is not ... –
Я не уверен, что делает эту ошибку. Это определенно не очень хорошая практика, и я бы хотел, чтобы PHP по умолчанию предупреждал о таких вещах, но поведение последовательное. – Matchu
Я держу пари, что это определение переменной как нечто к действию ${''}
или переменной без имени, или что-то вдоль этих линий.
Поскольку ни $a
, ни , ни $aaa
не определены, все они указывают на то же самое напуганное пустое имя переменной при использовании в контексте переменных переменных.
Ну, если $ a пуст, то вы устанавливаете пустое имя переменной в = 'hello world' ... Итак, каждый раз, когда вы ссылаетесь на это имя пустой переменной, вы получите то, что там хранится. .
это так же, как
$a = '';
$$a = 'Foo Bar';
$b = '';
echo $$b; //Displays Foo Bar
Вы не получаете это правильно, считают это:
$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
Я понимаю переменную переменную, меня просто удивляет, что может быть неназванная переменная, или переменная с нулем или пустая строка, заданная как ее имя. – Dami
При выполнении
$$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.
Я бы рассмотреть возможность назначения пустой именованной переменной ошибка в самом деле.
Существует несколько связанных с ошибкой, поданной для этого уже:
Не уверен, что это ирония, разве это не то, чего вы ожидаете? Разве это не говорит больше о том, как работает парсер, поскольку он распознает только явные объявления пустой строки. Отказ от ответственности: я ничего не знаю о php. – Grantismo
@Grantismo Я бы ожидал, что PHP не позволит мне делать $ {''} = 'foo', когда я не могу сделать $ = 'foo', и в руководстве указано, что переменные должны иметь имя. Кроме того, общий способ назначения переменных без фигурных скобок. Но да, заставляет вас задуматься о парсере :) – Gordon
Это, вероятно, поведение – Dami
PHP 5.3 Нет это не так, он не получает это право. – Sarfraz
Спасибо всем. Другими словами, это имеет смысл. echo $ {null}; действительно. – Dami