【问题标题】:PHP infinite loop on two communicating classes两个通信类上的PHP无限循环
【发布时间】:2021-10-23 00:34:36
【问题描述】:

这是我第一次遇到这个问题,希望你能给我一些解释或一些动力来解决它。

我在这里写了这段代码:

class Foo
{
    public function __construct()
    {
        $this->bar = New Bar();
    }
}

class Bar
{
    public function __construct()
    {
        $this->foo = New Foo();
    }
}

$foo = New Foo();

此代码引发以下错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes)

如何让两个类相互通信而不出现此错误?

编辑:

根据要求,我将详细介绍一下。例如,我编写了两个强制相互通信的类,类似于我当前的项目:

    class UserStatusController
    {
        public function __construct()
        {
            $this->couponController = New CouponController();
        }
        
        private $badStatus = "blocked";
        
        public function hasBadStatus(int $id): bool
        {
            $user = User::where(['id' => $id])->get();
            return $user->status == self::$badStatus ? true : false;
        }
        
        public function actualizeStatus(int $id, string $status): bool
        {
            if ($status == self::$badStatus) {
                
                $this->couponController->deleteCoupon();
                return false;
            }
            
            $user = User::where(['id' => $id])->update(['status' => $status]);
            $this->couponController->createCoupon();

            return true;
        }
    }
    
    class CouponController
    {
        public function __construct()
        {
            $this->userStatusController = New UserStatusController();
        }
        
        public function createCoupon(): bool 
        {
            if ($this->userStatusController->hasBadStatus()) { return false; }
            // create coupon ...
        }
        
        public function deleteCoupon(): bool 
        {
            // delete coupon ...
        }
    }

由于这两个类都有其他类需要的信息,所以它们必须以某种方式交换数据。在上面的例子中有一个无限循环。

所以问题是,让这两个类相互交谈的最常见方式是什么?

【问题讨论】:

  • 每次构造一个类时,它会立即构造另一个类,然后生成第一个类的新副本,然后生成第二个类的新副本,以此类推。您是否希望每个类保持对彼此的引用?
  • 循环引用通常是不好的做法。 Foo 真的需要 引用 Bar 吗?反之亦然?也许有一个,但另一个没有?也许你需要一个模型类来处理两者之间的通信,或者你想使用一些接口来抽象两者之间的通信。

标签: php loops class memory size


【解决方案1】:

在您的代码中,您在 Foo 类中启动 New Bar();,然后在 Bar 类中启动 New Foo(),后者启动 New Bar(),依此类推。

下面的代码返回bool(true),我认为这就是你想要实现的目标。

<?php
class Foo
{
    public function foo1()
    {
        return true;
    }
}
class Bar
{
    public function __construct()
    {
        $this->foo = New Foo();
    }
}
$foo = New Foo();
var_dump( $foo->foo1() );

如果您需要其他内容,请编辑您的问题并更加具体。另一方面,如果您像这样修改代码:

class Foo
{
    public function foo1()
    {
        return true;
    }
}
class Bar
{
    public function __construct()
    {
        $this->foo = New Foo();
        return $this->foo;
    }
}
$foo = New Bar();
var_dump($foo);

结果是object(Bar)#1 (1) { ["foo"]=&gt; object(Foo)#2 (0) { } }

另外,如果这 2 个函数在同一个文件中,则不需要另一个类。如果它们必须在单独的文件中,您可以写class bar extends Foo。有很多OOP课程和免费视频讲解类、功能等。

【讨论】:

  • 请检查我添加的代码,我认为这是一个简单的架构问题。谢谢你的回答。如果没有进一步的cmets,我将关闭此帖子并继续处理软件架构的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2011-11-19
  • 1970-01-01
  • 2017-10-08
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多