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

错误:

从空值创建默认对象

代码:

$res->success = false;

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


当前回答

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

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

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

$res->success = false;

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

其他回答

简单地说,

    $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不会对这行显示任何警告/通知。例如:

$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value

为了防止这一行的警告,你必须把“@”字符放在行开头,像这样:

@$unknownVar[$someStringVariable]->totalcall += 10; // no problem. created a stdClass object that name is $unknownVar[$someStringVariable] and created a properti that name is totalcall, and it's default value is 0.
$unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore.
echo $unknownVar[$someStringVariable]->totalcall; // 20

我在开发时使用这个技巧。我不喜欢禁用所有警告消息,因为如果你不正确处理警告,那么他们将成为一个大错误在未来。

我也有类似的问题,这似乎解决了问题。你只需要将$res对象初始化为一个类。假设这里的类名是test。

class test
{
   //You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;

这是我在PHP 7中遇到的一个警告,解决这个问题的简单方法是在使用变量之前初始化它

$myObj=new \stdClass();

一旦你初始化了它,你就可以将它用于对象

 $myObj->mesg ="Welcome back - ".$c_user;

您可能需要检查变量是否声明并具有正确的类型。

if (!isset($res) || !is_object($res)) {
    $res = new \stdClass();
    // With php7 you also can create an object in several ways.
    // Object that implements some interface.
    $res = new class implements MyInterface {};
    // Object that extends some object.
    $res = new class extends MyClass {};
} 

$res->success = true;

参见PHP匿名类。