2016-09-01 4 views
4

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

Спасибо.

+3

Можете ли вы привести пример, где это может иметь значение ...? – deceze

+0

Как в каком-то экзотическом сценарии, где переменная будет изменена в выражении, переданном как аргумент функции, при использовании той же переменной, что и другой аргумент функции в том же вызове? –

ответ

6

Обычно, да. Как 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.


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

+2

О, мальчик ... * hyperventilates * – deceze

+0

54161 не выглядит особенно ... уместным. – deceze

+1

К сожалению, один из них: 54162. Я разработчик, что я могу сказать ... – bishop

4

От the manual:

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

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

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

Смежные вопросы