两个通信类上的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"]=> object(Foo)#2 (0)
另外,如果这 2 个函数在同一个文件中,则不需要另一个类。如果它们必须在单独的文件中,您可以写class bar extends Foo
。有很多OOP课程和免费视频讲解类、功能等。
【讨论】:
请检查我添加的代码,我认为这是一个简单的架构问题。谢谢你的回答。如果没有进一步的cmets,我将关闭此帖子并继续处理软件架构的主题。以上是关于两个通信类上的PHP无限循环的主要内容,如果未能解决你的问题,请参考以下文章