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

时间:2012-01-17 19:43:09

标签: php

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

错误:

  

从空值创建默认对象

代码:

$res->success = false;

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

17 个答案:

答案 0 :(得分:546)

对于PHP版本< = 5.3.x,您的新环境可能会E_STRICT警告enabled in error_reporting,或者只需将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

为了符合PHP 5.4之前的E_STRICT标准,或者PHP> = 5.4中的正常E_WARNING错误级别,假设您正在尝试创建通用对象并分配属性{ {1}},您需要在全局命名空间中将success声明为$res的对象:

stdClass

答案 1 :(得分:45)

对于PHP< = 5.3,此消息为E_STRICT。从PHP 5.4开始,它被改为E_WARNING。由于E_WARNING消息很有用,因此您不希望完全禁用它们。

要摆脱此警告,您必须使用以下代码:

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

$res->success = false;

这是完全等效的替换。它确保了PHP默默地做的事情 - 不幸的是现在有警告 - 隐式对象创建。您应该始终检查对象是否已经存在,除非您完全确定它不存在。迈克尔提供的代码一般都不好,因为在某些情况下,对象有时可能已在代码中的相同位置定义,具体取决于具体情况。

答案 2 :(得分:9)

简单地说,

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

    $res = (object)array(); // object(stdClass)

    $res = new stdClass();  // old method

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

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

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

答案 3 :(得分:4)

试试这个:

ini_set('error_reporting', E_STRICT);

答案 4 :(得分:3)

如果您在行中加上“@”字符,则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

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

答案 5 :(得分:2)

  1. 首先认为您应该创建对象 $ res = new \ stdClass();

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

答案 6 :(得分:2)

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

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

这会发送对象 ARRAY 供以后使用〜!

答案 7 :(得分:1)

获得此错误的一种简单方法是在下面键入(a),这意味着键入(b)

(a) $this->my->variable

(b) $this->my_variable

琐碎,但很容易被忽视,如果你不是在寻找它,很难发现。

答案 8 :(得分:1)

我有类似的问题,这似乎可以解决问题。您只需要将$ res对象初始化为class即可。假设这里的类名是test。

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

答案 9 :(得分:0)

在PHP 7中,可以通过以下方式创建匿名对象:

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

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

答案 10 :(得分:0)

这是我在PHP 7中遇到的警告,对此的简单解决方法是在使用变量之前对其进行初始化

$myObj=new \stdClass();

初始化后,便可以将其用于对象

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

答案 11 :(得分:0)

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

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

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

我做了一个很小的改动。

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

只需将$ data用作引用。

我希望这可以帮助某人,这真让我烦恼!

答案 12 :(得分:0)

您可能需要检查声明的变量是否正确。

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 anonymous classes

答案 13 :(得分:0)

导致此问题的原因是您正在分配未启动的对象实例。例如:

您的情况:

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

<强>解决方案:

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

答案 14 :(得分:-1)

不,你没有..当你将成功值添加到对象时它会创建它。如果你没有指定一个默认类,它将被继承。

答案 15 :(得分:-2)

尝试使用:

$user = (object) null;

答案 16 :(得分:-11)

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

error_reporting(E_ERROR | E_PARSE);