两个通信类上的PHP无限循环

Posted

技术标签:

【中文标题】两个通信类上的PHP无限循环【英文标题】:PHP infinite loop on two communicating classes 【发布时间】: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 吗?反之亦然?也许有一个,但另一个没有?也许你需要一个模型类来处理两者之间的通信,或者你想使用一些接口来抽象两者之间的通信。 【参考方案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,我将关闭此帖子并继续处理软件架构的主题。

以上是关于两个通信类上的PHP无限循环的主要内容,如果未能解决你的问题,请参考以下文章

ReactJs 上的无限循环渲染组件

PHP二叉树递归遍历无限循环问题

android两个animation无限循环怎么做?

PHP 在循环中无限休眠

Java TCP Client-Server - 在两个应用程序中陷入无限循环[重复]

PHP在用户断开连接时中止无限循环