在PHP中从空值创建默认对象?

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

错误:

从空值创建默认对象

代码:

$res->success = false;

我是否首先需要声明$res对象?

657574 次浏览

你的新环境可能有E_STRICT警告error_reporting中启用 for PHP版本<= 5.3。x,或者简单地将error_reporting设置为至少E_WARNING, PHP版本为>= 5.4。当$resNULL或尚未初始化时触发该错误:

$res = NULL;
$res->success = false; // Warning: Creating default object from empty value

如果$res已经初始化为某个值但不是一个对象,PHP将报告一个不同的错误消息:

$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object

为了符合php5.4之前的E_STRICT标准,或php> = 5.4中正常的E_WARNING错误级别,假设你试图创建一个泛型对象并分配属性success,你需要在全局命名空间中将$res声明为stdClass的对象:

$res = new \stdClass();
$res->success = false;

不,你不需要。当您将成功值添加到对象时,它将创建它。如果没有指定默认类,则继承默认类。

试试这个:

ini_set('error_reporting', E_STRICT);

此消息已被E_STRICT for PHP <= 5.3。自PHP 5.4起,它不幸地被更改为E_WARNING。由于E_WARNING消息是有用的,你不希望完全禁用它们。

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

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


$res->success = false;

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

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

你的情况:

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

解决方案:

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

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

$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.
}

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

简单地说,

    $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)
< p >更多信息: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting < / p >

我把以下内容放在出错的PHP文件的顶部,错误不再显示:

error_reporting(E_ERROR | E_PARSE);

得到这个错误的一个简单方法是输入下面的(A),意思是输入(b)

(一) $this->my->variable

(b) $this->my_variable

微不足道,但很容易被忽视,如果你不去寻找,就很难发现。

如果你在行首放了“@”字符,那么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

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

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

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匿名类

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

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

尝试使用:

$user = (object) null;

我在尝试向API返回的对象添加变量时遇到了类似的问题。我用foreach循环遍历数据。

foreach ( $results as $data ) {
$data->direction = 0;
}

这在Laravel中抛出了“从空值创建默认对象”异常。

我用很小的改动就修好了。

foreach ( $results as &$data ) {
$data->direction = 0;
}

通过简单地将$data作为引用。

我希望这能帮助到一些人,因为这让我很烦!

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

$myObj=new \stdClass();

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

 $myObj->mesg ="Welcome back - ".$c_user;
    首先,你应该创建一个对象 $res = new \stdClass();

  1. 然后为对象分配键和值为thay $res->success = false;

在PHP 7中,匿名对象可以这样创建:

$res = new class {
public $success = false;
};

https://www.php.net/manual/en/language.oop5.anonymous.php http://sandbox.onlinephpfunctions.com/code/ab774707a8219c0f35bdba49cc84228b580b52ee < / p >

从PHP 7开始,当变量为空时,可以使用空合并操作符来创建对象。

$res = $res ?? new \stdClass();
$res->success = false;