Home » Php » Initialize Objects like arrays in PHP?

Initialize Objects like arrays in PHP?

Posted by: admin April 23, 2020 Leave a comment

Questions:

In PHP, you can initialize arrays with values quickly using the following notation:

$array = array("name" => "member 1", array("name" => "member 1.1") ) ....

is there any way to do this for STDClass objects?
I don’t know any shorter way than the dreary

$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";
How to&Answers:

From a (now dead) post showing both type casting and using a recursive function to convert single and multi-dimensional arrays to a standard object:

<?php
function arrayToObject($array) {
    if (!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    if (is_array($array) && count($array) > 0) {
        foreach ($array as $name=>$value) {
            $name = strtolower(trim($name));
            if (!empty($name)) {
                $object->$name = arrayToObject($value);
            }
        }
        return $object;
    }
    else {
        return FALSE;
    }
}

Essentially you construct a function that accepts an $array and iterates over all its keys and values. It assigns the values to class properties using the keys.

If a value is an array, you call the function again (recursively), and assign its output as the value.

The example function above does exactly that; however, the logic is probably ordered a bit differently than you’d naturally think about the process.

Answer:

You can use type casting:

$object = (object) array("name" => "member 1", array("name" => "member 1.1") );

Answer:

I also up-voted Gumbo as the preferred solution but what he suggested is not exactly what was asked, which may lead to some confusion as to why member1o looks more like a member1a.

To ensure this is clear now, the two ways (now 3 ways since 5.4) to produce the same stdClass in php.

  1. As per the question’s long or manual approach:

    $object = new stdClass;
    $object->member1 = "hello, I'm 1";
    $object->member1o = new stdClass;
    $object->member1o->member1 = "hello, I'm 1o.1";
    $object->member2 = "hello, I'm 2";
    
  2. The shorter or single line version (expanded here for clarity) to cast an object from an array, ala Gumbo’s suggestion.

    $object = (object)array(
         'member1' => "hello, I'm 1",
         'member1o' => (object)array(
             'member1' => "hello, I'm 1o.1",
         ),
         'member2' => "hello, I'm 2",
    );
    
  3. PHP 5.4+ Shortened array declaration style

    $object = (object)[
         'member1' => "hello, I'm 1",
         'member1o' => (object)['member1' => "hello, I'm 1o.1"],
         'member2' => "hello, I'm 2",
    ];
    

Will both produce exactly the same result:

stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)

nJoy!

Answer:

You can use :

$object = (object)[]; // shorter version of (object)array();

$object->foo = 'bar';

Answer:

You could try:

function initStdClass($thing) {
    if (is_array($thing)) {
      return (object) array_map(__FUNCTION__, $thing);
    }
    return $thing;
}

Answer:

I use a class I name Dict:

class Dict {

    public function __construct($values = array()) {
        foreach($values as $k => $v) {
            $this->{$k} = $v;
        }
    }
}

It also has functions for merging with other objects and arrays, but that’s kinda out of the scope of this question.

Answer:

from this answer to a similar question:

As of PHP7, we have Anonymous Classes which would allow you to extend a class at runtime, including setting of additional properties:

$a = new class() extends MyObject {
    public $property1 = 1;
    public $property2 = 2;
};

echo $a->property1; // prints 1

It’s not as succinct as the initializer for array. Not sure if I’d use it. But it is another option you can consider.

Answer:

Another option for deep conversion is to use json_encode + json_decode (it decodes to stdClass by default). This way you won’t have to repeat (object) cast in each nested object.

$object = json_decode(json_encode(array(
     'member1' => "hello, I'm 1",
     'member1o' => array(
         'member1' => "hello, I'm 1o.1",
     ),
     'member2' => "hello, I'm 2",
)));

output:

php > print_r($object);
stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)