PHP 8中Accessor魔术方法失效问题及替代方案咨询
PHP 8.x下的等效解决方案
1. 修复__set魔术方法的递归问题
在PHP 8.x中,直接在__set方法内执行$this->$name = $value会触发无限递归(未定义属性的赋值操作会再次调用__set)。你可以选择以下两种方案:
方案A:允许动态属性
在类上添加#[\AllowDynamicProperties]注解,允许类拥有未声明的动态属性,原逻辑可保留:
#[\AllowDynamicProperties] class YourClassName { public function __set($name, $value) { $this->$name = $value; } // 其他类方法... }
方案B:数组存储动态属性
更规范的方式是用类内数组统一存储动态属性,避免依赖动态特性:
class YourClassName { private array $dynamicProps = []; public function __set($name, $value) { $this->dynamicProps[$name] = $value; } // 可选:若需读取动态属性,补充__get方法 public function __get($name) { return $this->dynamicProps[$name] ?? null; } // 其他类方法... }
2. 替换已移除的each()函数
PHP 8.0彻底移除了each()函数,你需要将while + each循环替换为foreach循环,这是完全等效的写法:
public function DisplayMenu($buttons) { echo " <nav>\n <ul>\n"; foreach ($buttons as $name => $url) { $this->DisplayButton($name, $url); } echo " </ul>\n </nav>\n"; }
内容的提问来源于stack exchange,提问作者Jaime Montoya
相关产品推荐
相关产品推荐

