首页 > 解决方案 > `$this` 在 PHP 5 的外部类中使用时是什么意思?

问题描述

我正在将应用程序从 PHP 5 服务器迁移到客户端的 PHP 7 服务器。我遇到了一些在 PHP 5 服务器上有效但在 PHP 7 服务器上崩溃的无意义代码(从某种意义上说,它不会引发错误或警告)。我试图理解$thisPHP 5 中的语义,这将帮助我破译代码在做什么:

if ( !is_object( $this ) )
{
    require_once '' . '/model/Model.php';

    $me = new Controller( false );
    $me->invoke();
}
else
{
    require_once 'model/Model.php';
}

冒犯性的陈述当然是if ( !is_object( $this ) )$this在课堂之外是非法的。我的猜测是代码试图实例化某种单例,并且只能假设在类外使用时$thisPHP5 中的语义解析$thisnullish。我无法确认这一点。

PHP曾经允许这种用法吗?或者是否有一些配置选项使其能够以这种方式使用?$this以这种方式使用时是什么意思?

标签: php

解决方案


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

实际上是 PHP 7.1 做出了改变——特别是修复 $this 变量RFC的不一致行为。在此之前,PHP 只是将其与任何其他未定义变量一样对待。现在您将看到一个致命错误,请参阅https://3v4l.org/b4Wte

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

真正快速的改变是将is_object检查换成isset,它仍然可以安全地运行$this. 但由于这条线永远是真的,你不妨把整个事情替换为

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

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

* 严格来说,从 PHP 4 开始,您可以重新定义$this以指向您想要的任何内容,但我猜这可能不适用于这里。


推荐阅读