只有在将PHP环境升级到PHP 5.4及更高版本后才能看到此错误。错误指向这行代码:
错误:
从空值创建默认对象
代码:
$res->success = false;
我是否首先需要声明我的$res
对象?
答案 0 :(得分:546)
对于PHP版本< = 5.3.x,您的新环境可能会E_STRICT
警告enabled in error_reporting
,或者只需将error_reporting
设置为至少E_WARNING
与PHP版本> ; = 5.4。 $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
错误级别,假设您正在尝试创建通用对象并分配属性{ {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)
首先认为您应该创建对象 $ res = new \ stdClass();
然后为对象分配键值对 $ 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;
答案 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);