Было отмечено в другом вопросе, что перенос результата вызова функции PHP в круглых скобках может каким-то образом преобразовать результат в полноценное выражение, так что следующее работы:
<?php
error_reporting(E_ALL | E_STRICT);
function get_array() {
return array();
}
function foo() {
// return reset(get_array());
// ^ error: "Only variables should be passed by reference"
return reset((get_array()));
// ^ OK
}
foo();
Я пытаюсь найти что-либо в документации явно и недвусмысленно объяснять, что здесь происходит. В отличие от С++, я не знаю достаточно о грамматике PHP и ее обработке выражений/выражений, чтобы получить ее сам.
Есть ли что-нибудь скрытое в документации относительно этого поведения? Если нет, может ли кто-нибудь объяснить это, не прибегая к предположению?
Update
Я впервые нашел этот EBNF, представляющий собой грамматику PHP, и попытался сам расшифровать мои скрипты, но в итоге отказался.
Затем используя phc
, чтобы сгенерировать файл .dot
из двух вариантов foo()
, я изображения AST для обоих сценариев, используя следующие команды:
$ yum install phc graphviz
$ phc --dump-ast-dot test1.php > test1.dot
$ dot -Tpng test1.dot > test1.png
$ phc --dump-ast-dot test2.php > test2.dot
$ dot -Tpng test2.dot > test2.png
В обоих случаях результат был точно таким же: