Является ли порядок оценки аргументов функции PHP гарантированным всегда одинаковым?Порядок оценки аргументов функции в PHP
Спасибо.
Является ли порядок оценки аргументов функции PHP гарантированным всегда одинаковым?Порядок оценки аргументов функции в PHP
Спасибо.
Обычно, да. Как the manual states:
[Function] аргументы оцениваются слева направо.
Но есть два крайние случаи, когда аргументы не оцениваются на всех:
$calls = 0;
register_shutdown_function(function() use (&$calls) {
echo $calls;
});
func_does_not_exist($calls++);
Это outputs0
на всех версиях PHP.
class Foo {}
$bar = 0;
$foo = new Foo($bar++);
echo $bar;
Это outputs0
на PHP < 7.1 и 1
на PHP> = 7.1. Он называется «Оптимизация Rasmus», и он встречается только в случае построения классов без формальных конструкторов. См. Также #67829, #54162 и #54170.
В целом, руководство верное. Для определенных функций аргументы вычисляются слева направо, а затем передаются в функцию. Неопределенные функции, для которых несуществующий конструктор является частным случаем, не квалифицируются как функции, и поэтому оценка перед вызовом сама не определена.
От the manual:
информация может быть передана функции через список аргументов, который является разделенный запятыми список выражений. Аргументы оцениваются слева направо.
Теоретически это может измениться в будущих версиях PHP, но я, конечно, этого не ожидал.
(И, пожалуйста, не пишите код, который полагается на него, ради каждого ...)
Можете ли вы привести пример, где это может иметь значение ...? – deceze
Как в каком-то экзотическом сценарии, где переменная будет изменена в выражении, переданном как аргумент функции, при использовании той же переменной, что и другой аргумент функции в том же вызове? –