PHP object literal

PhpObjectLiteralsObject Literal

Php Problem Overview


In PHP, I can specify array literals quite easily:

array(
    array("name" => "John", "hobby" => "hiking"),
    array("name" => "Jane", "hobby" => "dancing"),
    ...
)

But what if I want array of objects? How can I specify object literal in PHP? I.e. in javascript it would be:

[    {name: "John", hobby: "hiking"},    {name: "Jane", hobby: "dancing"}]

Php Solutions


Solution 1 - Php

As BoltClock mentioned there is no object literal in PHP however you can do this by simply type casting the arrays to objects:

$testArray = array(
    (object)array("name" => "John", "hobby" => "hiking"),
    (object)array("name" => "Jane", "hobby" => "dancing")
);

echo "Person 1 Name: ".$testArray[0]->name;
echo "Person 2 Hobby: ".$testArray[1]->hobby;
    

Solution 2 - Php

As of PHP 5.4 you can also use the short array syntax:

$json = [    (object) ['name' => 'John', 'hobby' => 'hiking'],
    (object) ['name' => 'Jane', 'hobby' => 'dancing'],
];

Solution 3 - Php

As others have noted, there is no object literal in PHP, but you can "fake" it by casting an array to an object.

With PHP 5.4, this is even more concise, because arrays can be declared with square brackets. For example:

$obj = (object)[
    "foo" => "bar",
    "bar" => "foo",
];

This would give you an object with "foo" and "bar" properties. However, I don't think this really provides much advantage over using associative arrays. It's just a syntax difference.

Consider embracing the uniqueness and "flavor" of all the languages you use. In JavaScript, object literals are all over the place. In PHP, associative arrays are functionally the same as JavaScript object literals, are easy to create, and are well understood by other PHP programmers. I think you're better off embracing this "flavor" than trying to make it feel like JavaScript's object literal syntax.

Solution 4 - Php

Another way would be to use the __set_state() magic method:

$object = stdClass::__set_state (array (
    'height'   => -10924,
    'color'    => 'purple',
    'happy'    => false,
    'video-yt' => 'AgcnU74Ld8Q'
));

Some more on the __set_state() method, where is it coming from and how is it supposed to be used.

Solution 5 - Php

Although casting as an (object) works fine on a single hierarchical level, it doesn't go deep. In other words, if we want objects at every level, we'd have to do something like:

$foods = (object)[
  "fruits" => (object)["apple" => 1, "banana" => 2, "cherry" => 3],
  "vegetables" => (object)["asparagus" => 4, "broccoli" => 5, "carrot" => 6]
];

However, instead of doing multiple casting as objects, we can wrap the whole thing in a json_encode and json_decode like this:

$foods = json_decode(json_encode([
  "fruits" => ["apple" => 1, "banana" => 2, "cherry" => 3],
  "vegetables" => ["asparagus" => 4, "broccoli" => 5, "carrot" => 6]
]));

That makes sure it's an object at the deepest level.

To answer klewis, you can then access this like:

echo $foods->vegetables->broccoli;

This example would output the number 5.

Solution 6 - Php

My way of JavaScript-style object literals in PHP is as follows:

First I create an associative array like this:

$test = array(
  'name' => "test",
  'exists' => true
);

Then I easily make it an object like this:

$test = (object)$test;

Now you can test it:

echo gettype($test); // "object"
echo $test->name; // "test"

Solution 7 - Php

In PHP, you have ro create an instance before you can use a class. Of course you can put the instances into an array later.

Solution 8 - Php

If you're wanting to define modules in the object literal pattern "like JavaScript", you could do something like this:

$object = (object) [
    'config' => (object) [
        'username' => 'Rob Bennet',
        'email' => '[email protected]'
    ],

    'hello' => function() use(&$object) {
        return "Hello " . $object->config->username . ". ";
    },

    'emailDisplay' => function() use(&$object) {
	    return "Your email address is " . $object->config->email;
    },

    'init' => function($options) use(&$object) {
	    $object->config = $options;
	    $doUsername = $object->hello;
	    $doEmail = $object->emailDisplay;
	    return $doUsername() . $doEmail();
    }
];

$sayMyInfo = $object->init;

echo $sayMyInfo((object) [
    'username' => 'Logan',
        'email' => '[email protected]'
]);

In this type of modular scenario, I usually opt for the facade pattern, I just like writing my calls thusly:

Module::action()->item;

or

Post::get()->title;

Neither of these patterns make it easy (or even possible sometimes) for testing. But this is just proof of concept. Technically, "no" there is no Object Literal in PHP, but if you're used to JavaScript syntax (which I am more so than PHP), you can fake it and do this. As you can see, it's a lot messier in PHP than in JavaScript.

Solution 9 - Php

If the json_decode(json_encode( $array )) isn't good for you, then you can use some similar functions like these. Which one is faster, I don't know.

function deep_cast_object( $o ){
  return deep_cast_object_ref( $o );
}

function deep_cast_object_ref( & $o ){

  if( is_array( $o ))
    $o = (object)$o;

  if( is_object( $o ))
    foreach( $o as & $v )
      deep_cast_object_ref( $v );

  return $o;
}

$obj = deep_cast_object(array(
  'Fractal' => array(
    'of'    => array(
      'bad' => 'design',
    ),
  ),
));

var_dump( $obj );

Solution 10 - Php

Simple solution

$obj = json_decode('{"ape":"kwyjibo"}');
echo $obj->ape;

[output:]
kwyjibo

Then you can wrap it into a function and return your literal object

$obj = literal_object(['key1','val1','key2','val2']);

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
QuestionTomasView Question on Stackoverflow
Solution 1 - PhpTimView Answer on Stackoverflow
Solution 2 - PhpmipaaaView Answer on Stackoverflow
Solution 3 - PhpJoshView Answer on Stackoverflow
Solution 4 - PhpSeptagramView Answer on Stackoverflow
Solution 5 - PhpDave LampertView Answer on Stackoverflow
Solution 6 - PhpReza Baradaran GazorisangiView Answer on Stackoverflow
Solution 7 - PhppgampeView Answer on Stackoverflow
Solution 8 - PhpRob BennetView Answer on Stackoverflow
Solution 9 - PhpbiziclopView Answer on Stackoverflow
Solution 10 - Phpvincent thorpeView Answer on Stackoverflow