这是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谢谢;我编辑了我的答案,以澄清这一点的价值。