get_class()期望参数1为对象,给定null

Pav*_*kin 6 php

当我尝试在新的本地计算机上部署Symfony 2.8项目时,在多个代码位置出现了此错误:

"Warning: get_class() expects parameter 1 to be object, null given"
Run Code Online (Sandbox Code Playgroud)

尚未在stackoverflow上找到这种情况,并花了一些时间找出原因。

Mar*_*tin 7

正如该问题的其他地方所述,在 PHP 7.2get_class手册中指出:

注意:从 PHP 7.2.0 开始,不再允许显式传递 NULL 作为对象。该参数仍然是可选的,并且从类内部调用没有参数的 get_class() 将起作用,但是现在传递 NULL 会发出 E_WARNING 通知。

正如您在自己的答案中发现的那样。

但是你说:

所以将php版本降级到7.1解决了这个问题。

降级 PHP 通常不是解决问题的最佳或长期方法*;相反,您需要将 包装get_class检查器函数中,例如is_object,或相反,is_null

$baz = new class();
$className = false; // catch all if $baz is not an object
if(is_object($baz)){
    $className = get_class($baz);
} 
Run Code Online (Sandbox Code Playgroud)
  • 正如Nicco Hasse所说,
    如果这个问题发生在 Symfony 代码中,仅仅改变 Symfony 代码并不是一个好主意。由于升级 Symfony 不是一种选择,如 OPs 的回答所述,保持 7.1 似乎是最好的解决方案

我会说,虽然“修复” Symphony 代码可能很繁琐,但我建议将限定符添加is_object到 Symphony 代码,然后在它出现时更新到最新的 Symphony 版本(我希望这会解决这个问题)。


Pav*_*kin 2

原因是PHP版本的差异。这个新警告是在 PHP 7.2 中实现的 - https://wiki.php.net/rfc/get_class_disallow_null_parameter

因此,将本地计算机上的 php 版本降级到 7.1(就像在生产服务器上一样)解决了问题。

我相信升级供应商也可能解决这个问题,但就我而言,这种方式不受客户欢迎。