这段代码代表某种递归。
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;
在这里如何工作?
要么我不明白,要么这是一段奇怪的代码,没有意义并且包含不必要的步骤。
最佳答案
这不是废话。它只是提供了一种传递单个非数组值或值数组的方法。 is_array()
检查和对 attach()
的递归调用是它决定是否 (1) 在 时添加
不是数组或 (2) 当 $observable
本身$observable$observable
是数组时添加 $observable
的每个元素。
回答您的具体问题:
是的,如果
$observable
是一个数组,则在第一次调用时$observable
会被调用一次is_array()
,然后对数组中的每个元素再进行一次。如果$observable
包含嵌套数组,例如[$obj1, [$obj2, $obj3]]
,它可能会被调用更多次。foreach
只是循环遍历数组(即,如果$observable
是一个数组)。它附加$observable
的每个元素,然后return
。无论$observable
是否是一个数组,它都应该返回$this
,既是为了一致性,也是为了允许 method chaining ,如$login->attach(new LogHandler)->attach(new EmailNotifier)->attach(new Foo);
。也就是说,它本身并没有什么问题。return;
只是退出该函数。同样,为了保持一致性并允许方法链接,它可能应该是return $this;
,但它并没有做任何特殊的事情。
关于php - 这是 PHP 递归的废话吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37659229/