Initialize Objects like arrays in PHP?
In PHP, you can initialize arrays with values quickly using the following notation:
$array = array("n开发者_运维问答ame" => "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";
You can use type casting:
$object = (object) array("name" => "member 1", array("name" => "member 1.1") );
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.
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";
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", );
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!
From a (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.
You can use :
$object = (object)[]; // shorter version of (object)array();
$object->foo = 'bar';
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.
You could try:
function initStdClass($thing) {
if (is_array($thing)) {
return (object) array_map(__FUNCTION__, $thing);
}
return $thing;
}
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.
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
)
精彩评论