Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从空值创建默认对象?_Php - Fatal编程技术网

在PHP中从空值创建默认对象?

在PHP中从空值创建默认对象?,php,Php,只有在将PHP环境升级到PHP5.4及更高版本后,我才会看到此错误。错误指向这行代码: 错误: 从空值创建默认对象 代码: 我是否首先需要声明我的$res对象?对于PHP版本=5.4,您的新环境可能有E\u STRICT警告。当$res为NULL或尚未初始化时,会触发该错误: $res = NULL; $res->success = false; // Warning: Creating default object from empty value 如果$res已初始化为某个值但不是对

只有在将PHP环境升级到PHP5.4及更高版本后,我才会看到此错误。错误指向这行代码:

错误:

从空值创建默认对象

代码:


我是否首先需要声明我的
$res
对象?

对于PHP版本=5.4,您的新环境可能有
E\u 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
为了遵守PHP5.4之前的
E_STRICT
标准,或者PHP>=5.4中的正常
E_警告
错误级别,假设您试图创建一个通用对象并分配属性
success
,则需要在全局命名空间中将
$res
声明为
stdClass
的对象:

$res = new \stdClass();
$res->success = false;

不,你没有。。将成功值添加到对象时,将创建该类。如果未指定默认类,则会继承该类。

请尝试以下操作:

ini_set('error_reporting', E_STRICT);

对于PHP,此消息已被
E_STRICT
此问题是由于您正在分配给未启动的对象实例而导致的。例如:

您的案例:

$user->email = 'exy@gmail.com';
$user = new User;
$user->email = 'exy@gmail.com';
解决方案:

$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.
}
这将发送对象的数组,供以后使用~

简单地说

    $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)
更多资讯:

我将以下内容放在出错PHP文件的顶部,错误不再显示:

error_reporting(E_ERROR | E_PARSE);

获取此错误的一个简单方法是在下面键入(A),意思是键入(b)

(a)
$this->my->variable

(b)
$this->my_变量

琐碎,但如果您不查找它,则很容易被忽略和发现。

如果您将“@”字符放在行的开头,则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对象初始化为一个类。假设这里的类名是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作为引用即可


我希望这对别人有帮助。我真是烦透了

这是我在PHP7中遇到的一个警告,简单的解决方法是在使用变量之前初始化它

$myObj=new \stdClass();
一旦初始化了它,就可以将其用于对象

 $myObj->mesg ="Welcome back - ".$c_user;
  • 首先,您应该创建一个对象 $res=new\stdClass()

  • 然后用键和值指定对象 $res->success=false


  • 在PHP 7中,可以通过以下方式创建匿名对象:

    $res = new class {
        public $success = false;
    };
    

    您如何/在哪里启动
    $res
    ?@NAVEED。尽管它将返回严格标准消息。。。首先手动创建对象是一种很好的做法,虽然PHP相对容忍粗制滥造的编码实践,但你不应该忽视正确的操作。明白了,我只是简单地回答了这个问题,不是定义或捍卫最佳实践:)你应该检查对象是否已经存在:
    if(!isset($res))$res=new stdClass();
    。否则,此代码不是“旧PHP”隐式对象创建的等效替代品。@托马斯,我们需要再次执行此操作吗?上次mods清理了注释线程,因为它没有增加多少价值。没有“旧PHP”隐式对象创建。它始终是一个错误,并且总是发出警告,只是在5.4中它从E_STRICT更改为E_warning,所以有些人在没有注意E_STRICT的情况下从未遇到过它。@PeterAlfvin在某个特定的运行中没有定义它!但是在不同的运行中,在代码中完全相同的位置,对象可能会发生错误已经定义好了!这是人们经常犯的错误,这也是我试图强调的原因。Michael,隐式对象创建一直存在,甚至在5.4中仍然存在。顺便说一句,PHP<5.3中既没有严格的E_,也没有警告。顺便说一句,mods已经恢复了评论,我被告知要降低它的音量,这就是我重新发布的原因它。@tomas哦,好吧,我想我明白你的意思了。奇怪的是,你/迈克尔不能就此了结。顺便说一句,这次交流让我意识到了斜体字。当你使用第三方库(如nusoap)并且不想/不能更改源时,这是完全有用的。在这种情况下,你可以将错误报告更改为E_严格级别的JU在需要其他源文件之前。虽然我只是将此添加到nusoap的顶部来解决我的问题。嗯?这里的代码禁用了所有错误报告,除了
    E_STRICT
    错误,包括抑制致命错误的消息。这不是解决此特定警告的合理建议,更重要的是,您需要注意的是ch从来都不想这样做。为什么有5个人对此进行了投票,我不知道。这太糟糕了!在调试时使用
    ini\u set('error\u reporting',-1);
    ,但不要像以前一样使用上面的方法。好吧,那么你通过隐藏这个来解决问题了吗?不确定你的代码是否能按预期工作……你不是假设类“User”存在?它可能不存在,现在它将生成一个不同的错误?实际上我没有创建