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
相关产品推荐
相关产品推荐

