我有一个Laravel4.2应用程序,它可以在PHP5上运行,没有任何问题。因为我安装了一个运行PHP7的新的流浪箱,所以当我运行一个函数名与类名(关系函数)相同的模型时,就会出现一个错误,如下所示:
<?php
use Illuminate\Database\Eloquent\SoftDeletingTrait;
class Participant extends \Eloquent
{
use SoftDeletingTrait;
[...]
public function participant()
{
return $this->morphTo();
}
[...]
}
我得到以下错误消息:
与其类同名的
方法在未来版本的PHP中将不再是构造函数;Participant有一个已弃用的构造函数(视图:...)
所以直到今天我才知道,在PHP4中,同名的方法是类的构造器。嗯。我真的是一个糟糕的程序员...但在这种情况下,根据我对PHP7中发生的事情的理解,它们纠正了我的一个失败,因为我从来不想使用这个函数作为构造函数,因为它只定义了一个有说服力的关系。
但是我怎样才能摆脱这条消息呢?据我所知,在PHP4中我的代码有but,但在PHP7中没有,对吧?如果没有必要,我不想重构这个函数,因为它在几个地方使用。
有人能解释一下我做错了什么吗?为什么它能在老版本的PHP上工作?
谢谢!
发布于 2016-04-01 01:37:11
据我所知,在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
方法,仅此而已。
发布于 2016-04-01 01:42:12
PHP 4样式构造函数(与定义它们的类同名的方法)已被弃用,并将在将来删除。如果PHP4构造函数是类中定义的唯一构造函数,则PHP7将发出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();
}
[...]
}
https://stackoverflow.com/questions/36339774
复制相似问题