PHP 8.0构造方法参数加访问修饰符报解析错误如何解决?
问题解决方法
错误根因
你使用的在构造方法参数前加访问修饰符的写法,是PHP 8.0才正式推出的构造方法属性提升特性,只要实际运行代码的PHP版本低于8.0,就会触发本次的语法错误。
多数情况下该问题是IDE配置的PHP版本和实际运行代码的环境版本不一致导致,并非本地安装了PHP8.0就一定会被当前运行环境调用。
解决步骤
方案1:保留新语法(推荐)
- 先校验实际运行的PHP版本:
- 命令行运行代码的场景:执行
php -v命令,确认返回的版本号≥8.0 - web服务运行代码的场景:在代码开头加入
<?php phpinfo(); ?>运行后,查看页面输出的实际PHP版本
- 命令行运行代码的场景:执行
- 如果版本低于8.0,升级运行环境的PHP版本到8.0及以上,原代码即可正常运行
- 若确认版本确实为8.0+仍报错,清除OPcache缓存后重试即可
方案2:兼容低版本写法
如果暂时无法升级PHP版本,将构造方法属性提升的写法改为手动声明类属性的传统写法即可,修改后的完整代码如下:
class MappedIteratorDemo implements Iterator { // 手动声明类属性 private array $items; public function __construct(array $items = []) { $this->items = $items; } public function current() { // TODO: Implement current() method. return current($this->items); } public function next() { // TODO: Implement next() method. return next($this->items); } public function key() { // TODO: Implement key() method. return key($this->items); } public function valid() { // TODO: Implement valid() method. return key($this->items) !== null; } public function rewind() { // TODO: Implement rewind() method. return reset($this->items); } } $mappedArray = [ 'name' => 'Ola', 'location' => 'Essen, Germany', 'role' => 'Software Developer', ]; $mappedIterDemo = new MappedIteratorDemo($mappedArray); foreach ($mappedIterDemo as $item =>$value) { print "$item : $value" . PHP_EOL; }
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

