Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是PHP递归吗?_Php_Recursion - Fatal编程技术网

这是PHP递归吗?

这是PHP递归吗?,php,recursion,Php,Recursion,这段代码表示某种递归 class Login implements Subject { protected $observers = []; public function attach($observable) { if (is_array($observable)) { foreach ($observable as $observer) { $this->attach($observer)

这段代码表示某种递归

class Login implements Subject
{
    protected $observers = [];
    public function attach($observable)
    {
        if (is_array($observable)) {
            foreach ($observable as $observer) {
                $this->attach($observer);
            }
            return;
        }
        $this->observers[] = $observable;
        return $this;
    }
}

$login->attach([
    new LogHandler,
    new EmailNotifier
]);
关于此代码,我有三个问题:

  • 数组($observable)
    是否对数组中的每个条目执行
    $observable
    ,对吗?假设数组
    $observable
    将有100个条目。对于每个数组项,
    is\u array()
    是否执行100次

  • foreach
    在这里是如何工作的?它似乎跳出了
    foreach
    循环,执行
    attach()
    ,然后返回到循环,直到到达数组的末尾

  • 如何返回在这里工作


  • 要么我不明白,要么这是一段奇怪的代码,毫无意义,包含了不必要的步骤。

    这不是胡说八道。它只是提供了一种传递单个非数组值或值数组的方法。
    is_array()
    检查和递归调用
    attach()
    是它如何决定(1)当
    $observable
    不是数组时添加
    $observable
    本身,还是(2)当
    $observable
    是数组时添加
    $observable
    的每个元素

    要回答您的具体问题:

  • 是,如果
    $observable
    是一个数组,则在第一次调用
    $observable
    时,会对
    $observable
    调用一次
    is_array()。如果
    $obbservable
    包含嵌套数组,例如
    [$obj1、[$obj2、$obj3]]
    ,则可能会调用更多次

  • foreach
    只是在数组上循环(也就是说,如果
    $observable
    是一个数组)。它附加
    $observable
    的每个元素,然后
    返回
    s。它可能会返回
    $this
    无论
    $observable
    是否是一个数组,以确保一致性和允许,比如
    $login->attach(新的LogHandler)->attach(新的EmailNotifier)->attach(新的Foo)。也就是说,它没有本质上的问题

  • 返回仅退出函数。同样,它应该
    返回$this的一致性,并允许方法链接,但它没有做任何特殊的事情


  • 回答1..3:使用调试器查看它是如何工作的。如果您手头没有调试器,请将
    echo()
    语句放在您感兴趣的每个语句之前(可能之后),运行代码,然后根据它输出的信息尝试了解它是如何工作的。在
    attach()
    方法中添加一个附加参数来跟踪嵌套级别(只是为了调试/理解)会有很大帮助。您的返回不重要,返回本身只存在于函数中。但是通过返回实例的引用,它允许在3上链接(
    $login->attach(new A)->attach(new B);
    ),正如我在OT的注释中添加的那样,返回
    $this
    允许链接。@xore谢谢;我编辑了我的答案,以澄清这一点的价值。