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