此代码表示某种递归。
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)
中的每个条目执行 $observable
,对吧?我们假设数组$observable
将有100个条目。对于每个数组项,is_array()
会被执行100次吗?
foreach
如何在这里工作?它似乎跳出foreach
循环并执行attach()
然后返回循环直到到达数组的末尾?
return;
如何在这里工作?
要么我没有得到它,要么这是一段奇怪的代码,没有任何意义,包括不必要的步骤。
答案 0 :(得分:3)
这不是废话。它只提供了传递单个非数组值或值数组的方法。对is_array()
的{{1}}检查和递归调用是如何决定(1)在attach()
不是数组时添加$observable
本身还是(2)添加每个元素当$observable
是一个数组时$observable
。{/ p>
回答您的具体问题:
是的,如果$observable
是一个数组,那么$observable
会在第一次调用时调用is_array()
一次,然后再一次调用数组中的每个元素。如果$observable
包含嵌套数组,可能会被调用更多次,例如$observable
。
[$obj1, [$obj2, $obj3]]
只是在数组上循环(也就是说,如果foreach
是一个数组)。它附加了$observable
的每个元素,然后是$observable
s。它应该返回return
,无论$this
是否为数组,都是为了保持一致性,并允许method chaining,如$observable
。也就是说,它没有任何内在错误。
$login->attach(new LogHandler)->attach(new EmailNotifier)->attach(new Foo);
只退出该功能。同样,它应该是return;
的一致性和允许方法链接,但它没有做任何特殊的事情。