我正在将应用程序从 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';
}
Run Code Online (Sandbox Code Playgroud)
冒犯性的陈述当然是if ( !is_object( $this ) ); $this在课堂之外是非法的。我的猜测是代码试图实例化某种单例,并且只能假设$this在 PHP5 中的语义在类外使用时解析$this为nullish。我无法确认这一点。
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();
Run Code Online (Sandbox Code Playgroud)
* 严格来说,从 PHP 4 开始,您可以重新定义$this指向任何您想要的内容,但我猜这可能不适用于此处。
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |