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

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

错误:

从空值创建默认对象

码:

$res->success = false; 

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

如果错误报告为PHP <= 5.3,或者只是将error_reporting设置为至少E_WARNING与PHP 5.4 +,那么您的新环境可能会在error_reporting启用 E_STRICT警告。 。 当$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错误级别,假设您正在尝试创建通用对象并指定属性success ,则需要将$res声明$res stdClass的对象在全局命名空间中:

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

这个消息已经被PHP的E_STRICT <= 5.3。 从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) $res = new stdClass(); // old method 

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

尝试这个:

 ini_set('error_reporting', E_STRICT); 

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

(a) $this->my->variable

(b) $this->my_variable

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

试试这个,如果你有数组并添加对象。

 $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供以后使用〜!

此问题是由于您正在分配给未启动的对象的实例而引起的。 例如:

你的情况:

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

解:

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

如果你把“@”字符放在行的前面,那么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 

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

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

我将下面的代码放在错误的PHP文件的顶部,错误不再显示:

 error_reporting(E_ERROR | E_PARSE);