仅在将我的PHP环境升级到PHP 5.4及更高版本后,我才看到此错误。错误指向以下代码行:
错误:
从空值创建默认对象
码:
$res->success = false;
我首先需要声明我的$res
对象吗?
仅在将我的PHP环境升级到PHP 5.4及更高版本后,我才看到此错误。错误指向以下代码行:
错误:
从空值创建默认对象
码:
$res->success = false;
我首先需要声明我的$res
对象吗?
Answers:
您的新环境可能已针对<= 5.3.x的PHP版本启用了E_STRICT
警告,或者仅针对至少>> 5.4的PHP版本设置了警告。当触发了错误的或者尚未初始化:error_reporting
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
为了符合E_STRICT
PHP 5.4之前的标准或E_WARNING
PHP> = 5.4中的常规错误级别,假设您尝试创建一个通用对象并分配该属性success
,则需要在全局名称空间中声明$res
为的对象stdClass
:
$res = new \stdClass();
$res->success = false;
if (!isset($res)) $res = new stdClass();
。否则,此代码不能等效地替代“旧PHP”隐式对象的创建。
此消息E_STRICT
适用于PHP <= 5.3。从PHP 5.4开始,它很不幸地更改为E_WARNING
。由于E_WARNING
消息很有用,因此您不想完全禁用它们。
要摆脱此警告,您必须使用以下代码:
if (!isset($res))
$res = new stdClass();
$res->success = false;
这是完全等效的替换。它可以确保PHP默默地做同样的事情-不幸的是现在发出警告-隐式对象创建。除非绝对确定不存在,否则应始终检查对象是否已存在。Michael提供的代码通常不好,因为在某些情况下,根据情况,有时可能已在代码的同一位置定义了该对象。
Undefined variable: res
。
只是,
$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/zh/language.types.object.php#language.types.object.casting
$this->route->uri = new stdClass();
对我不起作用,我仍然有警告。注意:$this->route
存在。
如果您在行首添加“ @”字符,则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
我在开发时使用了这个技巧。我不喜欢禁用所有警告消息,因为如果您不能正确处理警告,那么将来它们将成为一个大错误。
如果您有数组并向其中添加对象,请尝试此操作。
$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.
}
这将发送对象数组以供以后使用〜!
尝试这个:
ini_set('error_reporting', E_STRICT);
E_STRICT
错误以外的所有错误报告,包括禁止显示致命错误消息。解决这个特定警告不是一个合理的建议,而且,您几乎从未想过这样做。为什么有5个人对此表示支持,我却一无所知。
ini_set('error_reporting', -1);
在调试时使用,但不要像以往一样使用以上内容。
我有类似的问题,这似乎可以解决问题。您只需要将$ res对象初始化为class即可。假设这里的类名是test。
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
这是我在PHP 7中遇到的警告,对此的简单解决方法是在使用变量之前对其进行初始化
$myObj=new \stdClass();
初始化之后,便可以将其用于对象
$myObj->mesg ="Welcome back - ".$c_user;
引起此问题的原因是您正在分配一个未启动的对象实例。例如:
您的情况:
$user->email = 'exy@gmail.com';
解:
$user = new User;
$user->email = 'exy@gmail.com';
获取此错误的一种简单方法是在下面键入(a),这意味着键入(b)
(一个) $this->my->variable
(b) $this->my_variable
琐碎,但很容易被忽略,如果您不想要它,很难发现它。
_
和->
您可能需要检查变量是否已声明并具有正确的类型。
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;
参见PHP匿名类。
首先认为您应该创建对象$ res = new \ stdClass();
然后为对象分配键和值thay $ res-> success = false;
thay
。)如果要在某些内容后换行,请在要中断的行之前在行的可见内容后附加两个空格。
不,您不..当您将成功值添加到对象时,它将创建它。如果您不指定默认值,则默认类将被继承。
$res
?