这个PHP递归是胡说八道吗?

时间:2016-06-06 13:49:51

标签: php recursion

此代码表示某种递归。

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
]);

我对此代码有三个问题:

    对于数组is_array($observable)中的每个条目执行
  1. $observable,对吧?我们假设数组$observable将有100个条目。对于每个数组项,is_array()会被执行100次吗?

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

  3. return;如何在这里工作?

  4. 要么我没有得到它,要么这是一段奇怪的代码,没有任何意义,包括不必要的步骤。

1 个答案:

答案 0 :(得分:3)

这不是废话。它只提供了传递单个非数组值或值数组的方法。对is_array()的{​​{1}}检查和递归调用是如何决定(1)在attach()不是数组时添加$observable本身还是(2)添加每个元素当$observable是一个数组时$observable。{/ p>

回答您的具体问题:

  1. 是的,如果$observable是一个数组,那么$observable会在第一次调用时调用is_array()一次,然后再一次调用数组中的每个元素。如果$observable包含嵌套数组,可能会被调用更多次,例如$observable

  2. [$obj1, [$obj2, $obj3]]只是在数组上循环(也就是说,如果foreach是一个数组)。它附加了$observable的每个元素,然后是$observable s。它应该返回return,无论$this是否为数组,都是为了保持一致性,并允许method chaining,如$observable。也就是说,它没有任何内在错误。

  3. $login->attach(new LogHandler)->attach(new EmailNotifier)->attach(new Foo);只退出该功能。同样,它应该是return;的一致性和允许方法链接,但它没有做任何特殊的事情。