Creating default object from empty value in PHP?

Php

Php Problem Overview


I see this error only after upgrading my PHP environment to PHP 5.4 and beyond. The error points to this line of code:

Error:

>Creating default object from empty value

Code:

$res->success = false;

Do I first need to declare my $res object?

Php Solutions


Solution 1 - Php

Your new environment may have E_STRICT warnings enabled in error_reporting for PHP versions <= 5.3.x, or simply have error_reporting set to at least E_WARNING with PHP versions >= 5.4. That error is triggered when $res is NULL or not yet initialized:

$res = NULL;
$res->success = false; // Warning: Creating default object from empty value

PHP will report a different error message if $res is already initialized to some value but is not an object:

$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object

In order to comply with E_STRICT standards prior to PHP 5.4, or the normal E_WARNING error level in PHP >= 5.4, assuming you are trying to create a generic object and assign the property success, you need to declare $res as an object of stdClass in the global namespace:

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

Solution 2 - Php

This message has been E_STRICT for PHP <= 5.3. Since PHP 5.4, it was unluckilly changed to E_WARNING. Since E_WARNING messages are useful, you don't want to disable them completely.

To get rid of this warning, you must use this code:

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

This is fully equivalent replacement. It assures exactly the same thing which PHP is silently doing - unfortunatelly with warning now - implicit object creation. You should always check if the object already exists, unless you are absolutely sure that it doesn't. The code provided by Michael is no good in general, because in some contexts the object might sometimes be already defined at the same place in code, depending on circumstances.

Solution 3 - Php

Simply,

    $res = (object)array("success"=>false); // $res->success = bool(false);

Or you could instantiate classes with:

    $res = (object)array(); // object(stdClass) -> recommended

    $res = (object)[];      // object(stdClass) -> works too

    $res = new \stdClass(); // object(stdClass) -> old method

and fill values with:

	$res->success = !!0;     // bool(false)

	$res->success = false;   // bool(false)

    $res->success = (bool)0; // bool(false)

More infos: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting

Solution 4 - Php

If you put "@" character begin of the line then PHP doesn't show any warning/notice for this line. For example:

$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value

For preventing this warning for this line you must put "@" character begin of the line like this:

@$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

I'm using this trick when developing. I don't like disable all warning messages becouse if you don't handle warnings correctly then they will become a big error in future.

Solution 5 - Php

Try this if you have array and add objects to it.

$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.
}

This sends ARRAY of Objects for later use~!

Solution 6 - Php

In PHP 7 anonymous objects can be created this way:

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

https://www.php.net/manual/en/language.oop5.anonymous.php http://sandbox.onlinephpfunctions.com/code/ab774707a8219c0f35bdba49cc84228b580b52ee

Solution 7 - Php

  1. First think you should create object $res = new \stdClass();

  2. then assign object with key and value thay $res->success = false;

Solution 8 - Php

Try this:

ini_set('error_reporting', E_STRICT);

Solution 9 - Php

I had similar problem and this seem to solve the problem. You just need to initialize the $res object to a class . Suppose here the class name is test.

class test
{
   //You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;

Solution 10 - Php

Starting from PHP 7 you can use a null coalescing operator to create a object when the variable is null.

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

Solution 11 - Php

A simple way to get this error is to type (a) below, meaning to type (b)

(a) $this->my->variable

(b) $this->my_variable

Trivial, but very easily overlooked and hard to spot if you are not looking for it.

Solution 12 - Php

You may need to check if variable declared and has correct type.

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;

See PHP anonymous classes.

Solution 13 - Php

Try using:

$user = (object) null;

Solution 14 - Php

I had a similar problem while trying to add a variable to an object returned from an API. I was iterating through the data with a foreach loop.

foreach ( $results as $data ) {
    $data->direction = 0;
}

This threw the "Creating default object from empty value" Exception in Laravel.

I fixed it with a very small change.

foreach ( $results as &$data ) {
    $data->direction = 0;
}

By simply making $data a reference.

I hope that helps somebody a it was annoying the hell out of me!

Solution 15 - Php

no you do not .. it will create it when you add the success value to the object.the default class is inherited if you do not specify one.

Solution 16 - Php

This problem is caused because your are assigning to an instance of object which is not initiated. For eg:

Your case:

$user->email = '[email protected]';

Solution:

$user = new User;
$user->email = '[email protected]';

Solution 17 - Php

This is a warning which I faced in PHP 7, the easy fix to this is by initializing the variable before using it

$myObj=new \stdClass();

Once you have intialized it then you can use it for objects

 $myObj->mesg ="Welcome back - ".$c_user;

Solution 18 - Php

I put the following at the top of the faulting PHP file and the error was no longer display:

error_reporting(E_ERROR | E_PARSE);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPaulView Question on Stackoverflow
Solution 1 - PhpMichael BerkowskiView Answer on Stackoverflow
Solution 2 - PhpTomasView Answer on Stackoverflow
Solution 3 - PhppirsView Answer on Stackoverflow
Solution 4 - PhpkodmanyaghaView Answer on Stackoverflow
Solution 5 - PhpDaniel AdenewView Answer on Stackoverflow
Solution 6 - PhpbancerView Answer on Stackoverflow
Solution 7 - PhpSukron Ma'munView Answer on Stackoverflow
Solution 8 - PhpIrfanView Answer on Stackoverflow
Solution 9 - PhpKevin Stephen BiswasView Answer on Stackoverflow
Solution 10 - PhpRedmalView Answer on Stackoverflow
Solution 11 - PhpTanninView Answer on Stackoverflow
Solution 12 - PhpAnton PelykhView Answer on Stackoverflow
Solution 13 - PhpFischer TiradoView Answer on Stackoverflow
Solution 14 - PhpAndyView Answer on Stackoverflow
Solution 15 - PhpSilvertigerView Answer on Stackoverflow
Solution 16 - PhpBastin RobinView Answer on Stackoverflow
Solution 17 - PhpAyan BhattacharjeeView Answer on Stackoverflow
Solution 18 - PhpDougView Answer on Stackoverflow