php - 这是 PHP 递归的废话吗?

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

我对这段代码有三个问题:

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

  2. foreach 在这里如何工作?好像是跳出foreach循环执行attach()然后返回循环直到到达数组末尾?

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

要么我不明白,要么这是一段奇怪的代码,没有意义并且包含不必要的步骤。

最佳答案

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

回答您的具体问题:

  1. 是的,如果 $observable 是一个数组,则在第一次调用时 $observable 会被调用一次 is_array() ,然后对数组中的每个元素再进行一次。如果 $observable 包含嵌套数组,例如 [$obj1, [$obj2, $obj3]],它可能会被调用更多次。

  2. foreach 只是循环遍历数组(即,如果 $observable 是一个数组)。它附加$observable的每个元素,然后return。无论 $observable 是否是一个数组,它都应该返回 $this,既是为了一致性,也是为了允许 method chaining ,如$login->attach(new LogHandler)->attach(new EmailNotifier)->attach(new Foo);。也就是说,它本身并没有什么问题。

  3. return; 只是退出该函数。同样,为了保持一致性并允许方法链接,它可能应该是 return $this;,但它并没有做任何特殊的事情。

关于php - 这是 PHP 递归的废话吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37659229/

相关文章:

c - 为什么我在 C 中使用指针的递归会崩溃?

php - 我可以从远程页面加载 jquery colorbox 吗?

algorithm - 括号对的递归算法

PHP ini file_get_contents 外部网址

php - 方法、常量、变量和字段的奇异名称 - 错误还是功能?

javascript - 在 CoffeeScript 中使用递归函数搜索对象

javascript - 如何使用递归函数将第一个数组元素添加到其他数组元素?

python - 在python中递归地向字符串添加行

php - 将 FB.Logout 插入其他脚本中的注销按钮/Fb.logout 不起作用

php - 获取xml属性中的简单数据