【发布时间】:2012-02-12 14:46:23
【问题描述】:
我仅在将我的 PHP 环境升级到 PHP 5.4 及更高版本后才看到此错误。错误指向这行代码:
错误:
从空值创建默认对象
代码:
$res->success = false;
我首先需要声明我的$res 对象吗?
【问题讨论】:
-
你是如何/在哪里发起
$res的? -
@NAVEED There.
标签: php
我仅在将我的 PHP 环境升级到 PHP 5.4 及更高版本后才看到此错误。错误指向这行代码:
错误:
从空值创建默认对象
代码:
$res->success = false;
我首先需要声明我的$res 对象吗?
【问题讨论】:
$res 的?
标签: php
对于 PHP 版本 E_STRICT 警告 enabled in error_reporting,或者对于 PHP 版本 >= 5.4,只需将 error_reporting 设置为至少 E_WARNING。当$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 声明为stdClass 的对象:
$res = new \stdClass();
$res->success = false;
【讨论】:
if (!isset($res)) $res = new stdClass();。否则,此代码不是“旧 PHP”隐式对象创建的等效替代品。
不,你没有......当你将成功值添加到对象时,它会创建它。如果你不指定,则继承默认类。
【讨论】:
试试这个:
ini_set('error_reporting', E_STRICT);
【讨论】:
E_STRICT 错误之外的所有错误报告,包括抑制致命错误的消息。这不是解决此特定警告的合理建议,更重要的是,您几乎永远都不想这样做。为什么有 5 个人对此表示赞同,我不知道。
ini_set('error_reporting', -1);,但不要像以前一样使用上面的。
对于 PHP E_STRICT。自 PHP 5.4 起,不幸地更改为 E_WARNING。由于E_WARNING 消息很有用,您不想完全禁用它们。
要消除此警告,您必须使用以下代码:
if (!isset($res))
$res = new stdClass();
$res->success = false;
这是完全等效的替换。它确保了与 PHP 正在默默地做的完全相同的事情——不幸的是现在有警告——隐式对象创建。您应该始终检查对象是否已经存在,除非您绝对确定它不存在。 Michael 提供的代码一般来说并不好,因为在某些情况下,对象有时可能已经在代码中的同一位置定义,具体取决于具体情况。
【讨论】:
Undefined variable: res。
此问题是由于您分配给未启动的对象实例而引起的。例如:
您的情况:
$user->email = 'exy@gmail.com';
解决方案:
$user = new User;
$user->email = 'exy@gmail.com';
【讨论】:
如果你有数组并添加对象,试试这个。
$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 的 Objects 供以后使用~!
【讨论】:
简单地说,
$res = (object)array("success"=>false); // $res->success = bool(false);
或者您可以使用以下方法实例化类:
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
并使用以下内容填充值:
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
更多信息: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting
【讨论】:
$this->route->uri = new stdClass(); 对我不起作用,我仍然有警告。注意:$this->route 已存在。
我将以下内容放在出错的 PHP 文件的顶部,错误不再显示:
error_reporting(E_ERROR | E_PARSE);
【讨论】:
得到这个错误的一个简单方法是在下面输入(a),意思是输入(b)
(a) $this->my->variable
(b) $this->my_variable
微不足道,但如果您不寻找它,很容易被忽视并且很难发现。
【讨论】:
_ 和 -> 之间没有混淆
如果你把“@”字符放在行的开头,那么 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
我在开发时使用了这个技巧。我不喜欢禁用所有警告消息,因为如果您没有正确处理警告,那么它们将来会成为一个大错误。
【讨论】:
您可能需要检查变量是否声明且类型正确。
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;
【讨论】:
我有类似的问题,这似乎解决了问题。您只需要将 $res 对象初始化为 class 。假设这里的类名是 test。
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
【讨论】:
尝试使用:
$user = (object) null;
【讨论】:
我在尝试将变量添加到从 API 返回的对象时遇到了类似的问题。我正在使用 foreach 循环遍历数据。
foreach ( $results as $data ) {
$data->direction = 0;
}
这在 Laravel 中引发了“从空值创建默认对象”异常。
我做了一个很小的改动。
foreach ( $results as &$data ) {
$data->direction = 0;
}
只需将 $data 设为引用即可。
我希望这对我很烦的人有所帮助!
【讨论】:
这是我在 PHP 7 中遇到的警告,解决此问题的简单方法是在使用变量之前对其进行初始化
$myObj=new \stdClass();
一旦你初始化了它,你就可以将它用于对象
$myObj->mesg ="Welcome back - ".$c_user;
【讨论】:
首先认为你应该创建对象 $res = 新 \stdClass();
然后用键和值 thay 分配对象 $res->成功=假;
【讨论】:
thay。)如果您想在某些内容之后换行,请在该行的可见内容前附加两个空格。跨度>
在 PHP 7 中可以这样创建匿名对象:
$res = new class {
public $success = false;
};
https://www.php.net/manual/en/language.oop5.anonymous.php http://sandbox.onlinephpfunctions.com/code/ab774707a8219c0f35bdba49cc84228b580b52ee
【讨论】: