在PHP中从空值创建默认对象?
只有在将我的PHP环境升级到PHP 5.4及更高版本后才会看到此错误。 错误指向这行代码:
错误:
从空值创建默认对象
码:
$res->success = false;
我首先需要声明我的$res
对象吗?
如果错误报告为PHP <= 5.3,或者只是将error_reporting
设置为至少E_WARNING
与PHP 5.4 +,那么您的新环境可能会在error_reporting
启用 E_STRICT
警告。 。 当$res
为NULL
或尚未初始化时触发该错误:
$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);