Функция внутри функции.?
Этот код производит результат как 56.
function x ($y) {
function y ($z) {
return ($z*2);
}
return($y+3);
}
$y = 4;
$y = x($y)*y($y);
echo $y;
Любая идея, что происходит внутри? Я запутался.
Ответы
Ответ 1
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);
}
Это также более читаемо.
Ответ 2
(4+3)*(4*2) == 56
Обратите внимание, что PHP действительно не поддерживает "вложенные функции", как в определении только в области родительской функции. Все функции определены глобально. См. docs.
Ответ 3
Не уверен, чего хотел достичь автор этого кода. Определение функции внутри другой функции НЕ означает, что внутренняя функция видна только внутри внешней функции. После вызова x() в первый раз функция y() также будет в глобальной области.
Ответ 4
Это полезная концепция для рекурсии без статических свойств, ссылки и т.д.:
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;
}
Ответ 5
Можно определить функцию из другой функции.
внутренняя функция не существует, пока не будет выполнена внешняя функция.
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
Ответ 6
Ваш запрос делает 7 * 8
x(4) = 4+3 = 7
и y(4) = 4*2 = 8
что происходит, когда функция x называется ее создает функцию y, она не запускает ее.