此代码生成结果为56.
function x ($y) {
function y ($z) {
return ($z*2);
}
return($y+3);
}
$y = 4;
$y = x($y)*y($y);
echo $y;
Run Code Online (Sandbox Code Playgroud)
知道里面会发生什么吗?我很迷惑.
Dur*_*oth 93
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);
}
Run Code Online (Sandbox Code Playgroud)
这也更具可读性.
Luk*_*ský 28
(4+3)*(4*2) == 56
Run Code Online (Sandbox Code Playgroud)
请注意,PHP并不真正支持"嵌套函数",因为仅在父函数的范围内定义.所有功能都是全局定义的.查看文档.
Ant*_*nna 16
不确定该代码的作者想要实现什么.在另一个函数内定义一个函数并不意味着内部函数只在外部函数中可见.在第一次调用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;
}
Run Code Online (Sandbox Code Playgroud)
可以从另一个函数内部定义一个函数.在执行外部函数之前,内部函数不存在.
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';
Run Code Online (Sandbox Code Playgroud)
产量
y未定义
y是定义的
简单的事情是你不能在执行x之前调用函数y