我将PHP环境升级到PHP 5.4及更高版本后才会看到此错误.错误指向这行代码:
错误:
从空值创建默认对象
码:
$res->success = false;
Run Code Online (Sandbox Code Playgroud)
我首先需要声明我的$res对象吗?
Mic*_*ski 588
对于PHP版本<= 5.3.x,您的新环境可能已启用E_STRICT警告,或者至少已设置为PHP版本> = 5.4.当触发了错误的或者尚未初始化:error_reportingerror_reportingE_WARNING$resNULL
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
Run Code Online (Sandbox Code Playgroud)
如果$res已经初始化为某个值但不是对象,PHP将报告不同的错误消息:
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
Run Code Online (Sandbox Code Playgroud)
为了符合E_STRICTPHP 5.4之前的标准,或E_WARNINGPHP> = 5.4中的正常错误级别,假设您正在尝试创建通用对象并分配属性success,则需要将其声明$res为stdClass全局命名空间中的对象:
$res = new \stdClass();
$res->success = false;
Run Code Online (Sandbox Code Playgroud)
TMS*_*TMS 50
此消息E_STRICT适用于PHP <= 5.3.从PHP 5.4开始,它就被改成了E_WARNING.由于E_WARNING消息很有用,因此您不希望完全禁用它们.
要摆脱此警告,您必须使用以下代码:
if (!isset($res))
$res = new stdClass();
$res->success = false;
Run Code Online (Sandbox Code Playgroud)
这完全等同于替换.它确保了PHP默默地做的事情 - 不幸的是现在有警告 - 隐式对象创建.您应该始终检查对象是否已经存在,除非您完全确定它不存在.迈克尔提供的代码一般不好,因为在某些情况下,对象有时可能已经在代码中的相同位置定义,具体取决于具体情况.
pir*_*irs 10
只是,
$res = (object)array("success"=>false); // $res->success = bool(false);
Run Code Online (Sandbox Code Playgroud)
要么
$res = (object)array(); // object(stdClass)
$res = new stdClass(); // old method
Run Code Online (Sandbox Code Playgroud)
和
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
Run Code Online (Sandbox Code Playgroud)
如果您有数组并向其中添加对象,请尝试此操作。
$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.
}
Run Code Online (Sandbox Code Playgroud)
这会发送对象数组供以后使用~ !
如果将“ @”字符放在该行的开头,则PHP不会在该行显示任何警告/通知。例如:
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
Run Code Online (Sandbox Code Playgroud)
为防止此行出现此警告,必须在该行的开头放置“ @”字符,如下所示:
@$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
Run Code Online (Sandbox Code Playgroud)
我在开发时使用了这个技巧。我不喜欢禁用所有警告消息,因为如果您不能正确处理警告,那么将来它们将成为一个大错误。