只有在将PHP环境升级到PHP 5.4或更高版本后,我才看到这个错误。错误指向这行代码:

错误:

从空值创建默认对象

代码:

$res->success = false;

我首先需要声明我的$res对象吗?


当前回答

此问题是由于您正在分配一个未初始化的对象实例而引起的。如:

你的情况:

$user->email = 'exy@gmail.com';

解决方案:

$user = new User;
$user->email = 'exy@gmail.com';

其他回答

简单地说,

    $res = (object)array("success"=>false); // $res->success = bool(false);

或者你可以实例化类:

    $res = (object)array(); // object(stdClass) -> recommended

    $res = (object)[];      // object(stdClass) -> works too

    $res = new \stdClass(); // object(stdClass) -> old method

并使用以下语句填充值:

    $res->success = !!0;     // bool(false)

    $res->success = false;   // bool(false)

    $res->success = (bool)0; // bool(false)

更多信息: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting

对于PHP <= 5.3,这个消息是E_STRICT。从PHP 5.4开始,它不幸地被更改为E_WARNING。因为E_WARNING消息很有用,所以您不希望完全禁用它们。

要消除此警告,必须使用以下代码:

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

这是完全等价替换。它保证了与PHP所做的完全相同的事情——不幸的是现在有警告——隐式对象创建。您应该始终检查对象是否已经存在,除非您绝对确定它不存在。Michael提供的代码一般来说并不好,因为在某些上下文中,对象有时可能已经在代码中的相同位置定义了,这取决于具体情况。

试试这个:

ini_set('error_reporting', E_STRICT);

尝试使用:

$user = (object) null;

如果您有数组并向其添加对象,请尝试此方法。

$product_details = array();

foreach ($products_in_store as $key => $objects) {
  $product_details[$key] = new stdClass(); //the magic
  $product_details[$key]->product_id = $objects->id; 
   //see new object member created on the fly without warning.
}

这将发送数组对象供以后使用~!