PHP7 构造函数类名

2022-08-30 15:14:09

我有一个Laravel 4.2应用程序,它可以与PHP5一起使用,没有任何问题。由于我安装了一个运行 PHP7 的新 vagrant box,因此一旦我运行一个函数名称与类名(关系函数)相同的模型,就会出现错误,如下所示:

<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

    public function participant()
    {
        return $this->morphTo();
    }

    [...]    

}

我收到以下错误消息:

与其类同名的方法在未来版本的PHP中不会是构造函数;参与者具有已弃用的构造函数 (查看: ...)

所以直到今天我才知道, 在 PHP4 中,同名的方法就是一个类的构造函数。嗯。我真的是一个糟糕的程序员...但是在这种情况下,根据我对PHP7中发生的事情的理解,他们纠正了我的一个失败,因为我从来不想使用这个函数作为构造函数,因为它只定义了一个雄辩的关系。

但是我该如何摆脱此消息?据我所知,在PHP4中,我的代码是错误的,但在PHP7中却没有,对吧?如果没有必要,我不想重构这个函数,因为它在几个地方使用。

任何人都可以解释我做错了什么,以及为什么它适用于较旧的PHP版本?

谢谢!


答案 1

据我所知,在PHP4中,我的代码是错误的,但在PHP7中却没有,对吧?

差一点。PHP4 样式的构造函数仍然在 PHP7 上运行,它们刚刚被弃用,它们将触发已弃用警告。

您可以做的是定义一个方法,甚至是一个空方法,这样就不会在新创建的类实例上调用php4构造函数方法。__construct

class foo
{
    public function __construct()
    {
        // Constructor's functionality here, if you have any.
    }

    public function foo()
    {
        // PHP4-style constructor.
        // This will NOT be invoked, unless a sub-class that extends `foo` calls it.
        // In that case, call the new-style constructor to keep compatibility.
        self::__construct();
    }
}

new foo();

它适用于较旧的PHP版本,仅仅是因为构造函数不会获得返回值。每次创建 Participant 实例时,您都会隐式调用该方法,仅此而已。participant


答案 2

PHP 4 样式构造函数(与定义它们的类同名的方法)已被弃用,并将在将来删除。如果 PHP 4 构造函数是类中定义的唯一构造函数,则 PHP 7 将发出E_DEPRECATED。实现 __construct() 方法的类不受影响。

<?php
    class foo {
        function foo() {
            echo 'I am the constructor';
         }
     }
?>

您可以保留旧的构造函数,但需要添加一个新构造,如下所示:

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

    public function __construct()
    {
        return $this->morphTo();
    }

    public function participant()
    {
        return $this->morphTo();
    }

    [...]    

}

推荐