在PHP5中,在类外使用“$this”意味着什么?

在PHP5中,在类外使用“$this”意味着什么?,php,Php,我正在为客户端将应用程序从PHP5服务器迁移到PHP7服务器。我遇到了一些荒谬的代码,它们在PHP5服务器上运行(从某种意义上说,它不会抛出错误或警告),但在PHP7服务器上崩溃。我试图理解PHP5中$this的语义,这将帮助我理解代码的作用: 如果(!is_对象($this)) { 需要一次“./model/model.php”; $me=新控制器(错误); $me->invoke(); } 其他的 { 需要一次“model/model.php”; } 如果(!is_object($this

我正在为客户端将应用程序从PHP5服务器迁移到PHP7服务器。我遇到了一些荒谬的代码,它们在PHP5服务器上运行(从某种意义上说,它不会抛出错误或警告),但在PHP7服务器上崩溃。我试图理解PHP5中
$this
的语义,这将帮助我理解代码的作用:

如果(!is_对象($this))
{
需要一次“./model/model.php”;
$me=新控制器(错误);
$me->invoke();
}
其他的
{
需要一次“model/model.php”;
}
如果(!is_object($this)),那么这个冒犯性的语句当然是
<代码>$this
在类之外是非法的。我的猜测是,代码试图实例化某种类型的单例,并且只能假设PHP5中的
$this
的语义在类外使用时解析为
$this
null
ish。我很难确认这一点


PHP允许这种使用吗?还是有一些配置选项使它能够以这种方式使用?当以这种方式使用时,
$this
意味着什么?

不,在全局范围内使用
$this
不会做任何有用的事情*

实际上是PHP7.1做出了改变——特别是RFC。在此之前,PHP只是将其与任何其他未定义变量一样处理。现在您将看到一个致命错误,请参见

我假设这段代码是从一个类方法复制的,在这个类方法中,它看起来像是试图从静态和对象上下文中运行

真正快速的改变是调出
is_对象
检查
isset
,它仍然可以使用
$this
安全运行。但既然这句话永远都是真的,你也可以用

require_once '' . '/model/Model.php';

$me = new Controller( false );
$me->invoke();

*严格地说,在PHP4中,您可以重新定义
$this
以指向您想要的任何内容,但我猜这可能不适用于这里。

您确定这不会引发任何错误吗?我在我的PHP5配置中检查了这一点,并指出了一个致命错误。我能想到的唯一边缘情况是,代码可能包含在类方法中-新文件不会启动新的作用域,因此$this仍然会被定义。但这在PHP7中仍然是一样的,所以我不认为这是怎么回事。我也很怀疑,但是没有,没有错误记录。我假设致命错误会导致HTTP 500?该应用程序既不记录日志也不出错。伊姆索普-是的,我也是这么想的。谢谢你们,你们叫它@IMSoP。在源代码中的数千个文件(其中许多是重复的…)中,有一个包含了类调用中的控制器,并对其进行了实例化。感谢链接,这正是我所寻找的!