Гарантирован ли порядок вычисления аргументов функции PHP всегда одинаковым?
Благодарю.
Обычно да. Как в руководстве говорится:
Аргументы [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.
Таким образом, руководство является правильным. Для определенных функций аргументы оцениваются слева направо, а затем передаются в функцию. Неопределенные функции, для которых несуществующий конструктор является особым случаем, не квалифицируются как функции, поэтому оценка перед вызовом сама по себе не определена.
От руководство:
Информация может передаваться функциям через список аргументов, который представляет собой список выражений через запятую. Аргументы оцениваются слева направо.
Теоретически это может измениться в будущих версиях PHP, но я, конечно, не ожидаю этого.
(И, пожалуйста, не пишите код, который опирается на него, ради всех …)