Этот код дает результат как 56.
function x ($y) { function y ($z) { return ($z*2); } return($y+3); } $y = 4; $y = x($y)*y($y); echo $y;
Любая идея, что происходит внутри? Я запутался.
X возвращает (значение +3), а Y возвращает (значение * 2)
При значении 4 это означает (4+3) * (4*2) = 7 * 8 = 56
.
Хотя функции не ограничены по объему (что означает, что вы можете безопасно «определять» определения функций), этот конкретный пример подвержен ошибкам:
1) Вы не можете вызвать y()
перед вызовом x()
, потому что функция y()
фактически не будет определена до тех пор, пока x()
не выполнит один раз.
2) Вызов x()
дважды заставит PHP переопределить функцию y()
, что приведет к фатальной ошибке:
Неустранимая ошибка: невозможно обновить y ()
Решение для обоих было бы разделение кода, так что обе функции объявлены независимо друг от друга:
function x ($y) { return($y+3); } function y ($z) { return ($z*2); }
Это также более читаемо.
(4+3)*(4*2) == 56
Обратите внимание, что PHP действительно не поддерживает «вложенные функции», как в определении только в области родительской функции. Все функции определены глобально. См. Документы .
Не знаете, чего хотел достичь автор этого кода. Определение функции внутри другой функции НЕ означает, что внутренняя функция видна только внутри внешней функции. После вызова x () в первый раз функция y () также будет в глобальной области.
Это полезная концепция для рекурсии без статических свойств, ссылки и т. Д .:
function getReqursiveItems($id){ $allItems = array(); function getItemms($parent_id){ return DB::findAll()->where('`parent_id` = $parent_id'); } foreach(getItems($id) as $item){ $allItems = array_merge($allItems, getItems($item->id) ); } return $allItems; }
Можно определить функцию из другой функции. внутренняя функция не существует до тех пор, пока внешняя функция не будет выполнена.
echo function_exists("y") ? 'y is defined\n' : 'y is not defined \n'; $x=x(2); echo function_exists("y") ? 'y is defined\n' : 'y is not defined \n';
Вывод
y не определено
y определяется
Простая вещь, которую вы не можете вызвать функцию y перед выполнением x
Ваш запрос делает 7 * 8
x(4) = 4+3 = 7
и y(4) = 4*2 = 8
что происходит, когда функция x называется, она создает функцию y, она не запускает ее.