You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP重载代码仅8行触发内存耗尽错误,求排查原因

PHP重载触发内存耗尽的常见原因及解决办法

嘿,这个问题我太熟了!PHP的重载魔法方法(__get/__set这类)很容易踩这个无限递归的坑,哪怕代码只有几行也会直接触发内存耗尽错误。

问题根源:无限递归调用

通常是你在重载方法里,不小心直接访问了要重载的目标属性,导致循环触发重载方法,直到把内存吃光。举个典型的错误示例(刚好8行左右):

class MyClass {
    private $storage = [];
    public function __get($key) {
        // 这里犯了致命错误:访问$this->$key会再次触发__get
        return $this->$key;
    }
}
$obj = new MyClass();
echo $obj->username; // 触发无限递归,内存耗尽

为什么会这样?当你尝试访问$obj->username时,因为username不是类的公共属性,PHP会自动调用__get('username')。但在__get方法里又写了return $this->$key,这相当于再次尝试访问$this->username,于是又触发__get,形成无限循环——PHP会不断重复这个过程,直到内存超出配置的限制。

正确的写法

解决办法很简单:用一个内部容器(比如私有数组)来存储要重载的属性,在重载方法里直接操作这个容器,而不是访问目标属性本身:

class MyClass {
    private $storage = [];
    public function __get($key) {
        // 直接访问内部存储数组,不会触发重载
        return isset($this->storage[$key]) ? $this->storage[$key] : null;
    }
    public function __set($key, $value) {
        $this->storage[$key] = $value;
    }
}
$obj = new MyClass();
$obj->username = "test";
echo $obj->username; // 正常输出"test"

总结

你只需要检查你的8行代码:

  • 是不是在__get或__set里直接访问了$this->$key这类表达式?
  • 如果是,把它改成访问你用来存储属性的内部变量(比如数组)就能解决问题。

内容的提问来源于stack exchange,提问作者user9058188

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:18:37