Порядок вычисления аргументов функции в переполнении стека

Гарантирован ли порядок вычисления аргументов функции PHP всегда одинаковым?

Благодарю.

4

Решение

Обычно да. Как в руководстве говорится:

Аргументы [Function] оцениваются слева направо.

Но есть два крайних случая, когда аргументы вообще не оцениваются:

$calls = 0;
register_shutdown_function(function () use (&$calls) {
echo $calls;
});
func_does_not_exist($calls++);

это выходы 0 на всех версиях PHP.

class Foo {}

$bar = 0;
$foo = new Foo($bar++);
echo $bar;

это выходы 0 на PHP < 7.1 и 1 на PHP> = 7.1. Это называется «оптимизация Расмуса», и это происходит только в случае построения классов без формальных конструкторов. Смотрите также # 67829, # 54162 а также # 54170.


Таким образом, руководство является правильным. Для определенных функций аргументы оцениваются слева направо, а затем передаются в функцию. Неопределенные функции, для которых несуществующий конструктор является особым случаем, не квалифицируются как функции, поэтому оценка перед вызовом сама по себе не определена.

6

Другие решения

От руководство:

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

Теоретически это может измениться в будущих версиях PHP, но я, конечно, не ожидаю этого.

(И, пожалуйста, не пишите код, который опирается на него, ради всех …)

4

По вопросам рекламы [email protected]