Функция внутри функции.?

Этот код дает результат как 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, она не запускает ее.