函数内部的函数.?

Pos*_*sto 65 php function

此代码生成结果为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)

这也更具可读性.

  • 另一个区别是,如果你有函数x内部函数y,你调用函数X两次,你会得到重新声明函数y错误.(如果你真的需要这一点,你需要围绕函数y用支票,如果(function_exists("Y")){...) (56认同)
  • "这意味着你可以安全'嵌套'函数定义,同时仍然能够在文件中的任何地方调用它们" - 这是一个可怕的语言属性. (4认同)
  • @Eugene M:我从来都不知道......感谢你指出来!(在重新评论之后,我自己进行了测试.) (3认同)
  • 迈克尔,您可以使用匿名函数,将它们分配给变量并享受,它的范围将受到限制.@Duroth,您还可以避免在使用匿名函数时重新声明错误. (2认同)

Luk*_*ský 28

(4+3)*(4*2) == 56
Run Code Online (Sandbox Code Playgroud)

请注意,PHP并不真正支持"嵌套函数",因为仅在父函数的范围内定义.所有功能都是全局定义的.查看文档.

  • 当然它确实如此,这就是"(4*2)"部分的结果. (2认同)
  • 当 X 被调用时,内部函数被定义 - 不被调用。结果就这样了。这是关于函数中函数的毛茸茸的部分 =) (2认同)

Ant*_*nna 16

不确定该代码的作者想要实现什么.在另一个函数内定义一个函数并不意味着内部函数只在外部函数中可见.在第一次调用x()之后,y()函数也将在全局范围内.

  • +1最后一句非常简洁地回答了这个问题. (4认同)
  • 另外,在x()中定义y()意味着x()只能被调用一次.第二次调用x()时,您将获得"函数已定义"致命错误. (2认同)

d.r*_*aev 8

这是没有静态属性,引用等递归的有用概念:

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)

  • 这看起来根本不是递归的,而是返回原始`$ id`的所有*孙子* (3认同)

Nan*_*mar 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';
Run Code Online (Sandbox Code Playgroud)

产量

y未定义

y是定义的

简单的事情是你不能在执行x之前调用函数y