访问器魔术方法在 PHP 8 中不起作用 [重复]

Accessor magic method not working in PHP 8 [duplicate]

提问人:Jaime Montoya 提问时间:8/18/2023 更新时间:8/18/2023 访问量:31

问:

我最近将 Ubuntu 从 20.04 LTS 升级到 22.04 LTS。我注意到PHP升级到了以下版本:

PHP 8.1.2-1ubuntu2.13 (cli) (built: Jun 28 2023 14:01:49) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.13, Copyright (c), by Zend Technologies

我的PHP应用程序在这部分停止工作:

public function __set($name, $value)
{
  $this->$name = $value;
}

public function DisplayMenu($buttons)
{
  echo "\t\t\t<nav>\n\t\t\t\t<ul>\n";
  while (list($name, $url) = each($buttons)) {
    $this->DisplayButton($name, $url);
  }
  echo "\t\t\t\t</ul>\n\t\t\t</nav>\n";
}

从 PHP 7.x 升级到 8.x 后,访问器魔术方法停止工作。在 PHP 8.x 中使用等效项的新方法是什么?谢谢。

php getter-setter setter php-8

评论

2赞 ceejayoz 8/18/2023
你得到什么错误?
2赞 Sammitch 8/18/2023
“停止工作”不足以描述问题,我们无法提供帮助。错误是什么?它应该做什么?它在做什么?
0赞 Jaime Montoya 8/18/2023
@ceejayoz HTML 被打印出来,当我在问题中发布的循环开始时,它停止工作。看起来该函数在 PHP 8 中被删除了。whileeach()
0赞 Jaime Montoya 8/18/2023
@Sammitch HTML 被打印出来,当我在问题中发布的循环开始时,它停止工作。看起来该函数在 PHP 8 中被删除了。whileeach()
2赞 ceejayoz 8/18/2023
在这种情况下,@JaimeMontoya“停止工作”应伴随错误消息。如果您没有看到,则应检查错误报告和日志;如果没有错误消息,生活会很艰难。

答:

4赞 Tim Roberts 8/18/2023 #1

它不是访问器。问题是该函数在 PHP 8 中被删除了。您需要切换到循环。eachforeach

<?php
class what 
{
    public function __set($name, $value)
    {
        $this->$name = $value;
    }

    public function DisplayButton($name,$value)
    {
        $this->$name = $value;
    }

    public function DisplayMenu($buttons)
    {
      echo "\t\t\t<nav>\n\t\t\t\t<ul>\n";
      foreach( $buttons as $name => $url ) {
        $this->DisplayButton($name, $url);
      }
      echo "\t\t\t\t</ul>\n\t\t\t</nav>\n";
    }
}

$x = new what();
$x->DisplayMenu(['a'=>'b','c'=>'d']);
print_r($x);
?>