php - `$this` 在 PHP 5 的外部类中使用时是什么意思?
问题描述
我正在将应用程序从 PHP 5 服务器迁移到客户端的 PHP 7 服务器。我遇到了一些在 PHP 5 服务器上有效但在 PHP 7 服务器上崩溃的无意义代码(从某种意义上说,它不会引发错误或警告)。我试图理解$this
PHP 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
在课堂之外是非法的。我的猜测是代码试图实例化某种单例,并且只能假设在类外使用时$this
PHP5 中的语义解析$this
为null
ish。我无法确认这一点。
PHP曾经允许这种用法吗?或者是否有一些配置选项使其能够以这种方式使用?$this
以这种方式使用时是什么意思?
解决方案
不,$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
以指向您想要的任何内容,但我猜这可能不适用于这里。
推荐阅读
- flutter - AnimatedList 中的滑块值错误
- swift - 如何从 Swift 中的 Pod 模块访问目标 c 方法
- python - 想在我的 Python 代码中添加多处理
- c++ - btHeightfieldTerrainShape 构造函数参数不明确
- java - 如何懒惰地评估嵌套的 flatMap
- mysql - Spring Data JPA Java - 如何从查询中获取最后10条记录并按列排序
- r - 识别 group_by 和 mutate 中的值
- typescript - Typescript 从现有记录创建新记录?
- python - 如何检查密码要求?
- laravel - 具有多个外键的一对多关系 laravel