如何使 PHP 版本 8 支持与 class 同名的构造函数?

How to make PHP version 8 support constructor with same name as class?

我有一个旧项目正在迁移到 PHP 版本 8,但是新的 PHP 版本不支持 class 基于 class 名称命名的构造函数,在旧版本中有效。

我希望class这样的人继续工作:

class Person {
    
    private $fname;
    private $lname;
    
    // Constructor same class name here
    public function Person($fname, $lname) {
        $this->fname = $fname;
        $this->lname = $lname;
    }
    
    // public method to show name
    public function showName() {
        echo "My name is: " . $this->fname . " " . $this->lname . "<br/>"; 
    }
}

// creating class object
$john = new Person("John", "Wick");
$john->showName();

Person更改为__construct

public function __construct($fname, $lname) {
    $this->fname = $fname;
    $this->lname = $lname;
}

https://3v4l.org/Ke39i

目前这不是一个好的做法,在 PHP 中已弃用。如果您将来使用构造函数名称作为方法名称,您将遇到麻烦。更好的构造函数使用 as__construcotr.

class Person {

    private $fname;
    private $lname;

    // Constructor same class name here
    public function __construct($fname, $lname) {
        $this->fname = $fname;
        $this->lname = $lname;
    }

    // public method to show name
    public function showName() {
        echo "My name is: " . $this->fname . " " . $this->lname . "<br/>";
    }
}

// creating class object
$john = new Person("John", "Wick");
$john->showName();

这不是您可以重新打开的设置,恐怕该功能已从 PHP 中永久删除。可以编写某种模拟旧行为的扩展,但从长远来看,这将比对所有现有文件进行一次性修复要多得多 运行。

您最好的选择可能是使用 Rector which can automate the upgrade process. In this case, using the Php4ConstructorRector 规则之类的工具,它应该可以为您完成所有工作。