这段代码的结果为56。
function x ($y) {
function y ($z) {
return ($z*2);
}
return($y+3);
}
$y = 4;
$y = x($y)*y($y);
echo $y;
知道里面发生了什么吗?我很迷惑。
Answers:
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);
}
这也更具可读性。
不确定该代码的作者想要实现什么。在另一个函数内部定义一个函数并不意味着内部函数仅在外部函数内部可见。第一次调用x()之后,y()函数也将在全局范围内。
这对于没有静态属性,引用等的递归非常有用:
function getRecursiveItems($id){
$allItems = array();
function getItems($parent_id){
return DB::findAll()->where('`parent_id` = $parent_id');
}
foreach(getItems($id) as $item){
$allItems = array_merge($allItems, getItems($item->id) );
}
return $allItems;
}
$id
getItems
在foreach
与getItemms
和第二getItems
带getReqursiveItems
你会得到递归函数。
您的查询正在做7 * 8
x(4) = 4+3 = 7
和 y(4) = 4*2 = 8
发生的情况是当调用函数x时,它创建函数y,而不运行它。
如果您需要执行一些递归过程,例如循环真正的多层数组或没有多个循环的文件树,或者有时我使用它来避免为需要划分的小工作创建类,则函数内部的函数或所谓的嵌套函数非常有用并在多个功能之间隔离功能。但是在使用嵌套函数之前,您必须了解
那么这意味着您不能使用嵌套函数吗?不,您可以使用以下解决方法
第一种方法是通过使用存在函数的条件块来阻止要声明的子函数进入全局函数栈,这将防止函数多次声明到全局函数栈中。
function myfunc($a,$b=5){
if(!function_exists("child")){
function child($x,$c){
return $c+$x;
}
}
try{
return child($a,$b);
}catch(Exception $e){
throw $e;
}
}
//once you have invoke the main function you will be able to call the child function
echo myfunc(10,20)+child(10,10);
第二种方法是将child的函数范围限制为local而不是global,为此,您必须将函数定义为Anonymous函数并将其分配给local变量,然后该函数将仅在local范围内可用,并且将在每次调用main函数时重新声明并调用。
function myfunc($a,$b=5){
$child = function ($x,$c){
return $c+$x;
};
try{
return $child($a,$b);
}catch(Exception $e){
throw $e;
}
}
echo myfunc(10,20);
请记住,子函数在主函数或全局函数堆栈之外将不可用