【发布时间】: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