提问人:Pekka 提问时间:11/16/2009 最后编辑:CharlesPekka 更新时间:11/25/2021 访问量:54787
在PHP中初始化像数组这样的对象?
Initialize Objects like arrays in PHP?
问:
在 PHP 中,您可以使用以下符号快速初始化带有值的数组:
$array = array("name" => "member 1", array("name" => "member 1.1") ) ....
有什么方法可以对 STDClass 对象执行此操作吗? 我不知道还有什么比沉闷更短的路了
$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";
答:
您可以使用类型转换:
$object = (object) array("name" => "member 1", array("name" => "member 1.1") );
评论
(object)
array
从显示类型转换和使用递归函数将一维和多维数组转换为标准对象的(帖子)中:
<?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;
}
}
从本质上讲,您构造了一个函数,该函数接受并遍历其所有键和值。它使用键将值分配给类属性。$array
如果值是数组,则再次(递归)调用该函数,并将其输出赋值为值。
上面的示例函数正是这样做的;但是,逻辑的顺序可能与您对该过程的自然思考略有不同。
评论
您可以尝试:
function initStdClass($thing) {
if (is_array($thing)) {
return (object) array_map(__FUNCTION__, $thing);
}
return $thing;
}
评论
__FUNCTION__
我使用一个名为 Dict 的类:
class Dict {
public function __construct($values = array()) {
foreach($values as $k => $v) {
$this->{$k} = $v;
}
}
}
它还具有与其他对象和数组合并的函数,但这有点超出了这个问题的范围。
我还投票将 Gumbo 作为首选解决方案,但他的建议并不完全是所问的,这可能会导致一些混淆,为什么看起来更像是 .member1o
member1a
为了确保现在很清楚这一点,两种方法(自 5.4 以来现在有 3 种方法)在 php 中生成相同的方法。stdClass
根据问题的漫长或手动方法:
$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";
较短或单行版本(为清楚起见,此处扩展)从数组中转换对象,ala Gumbo 的建议。
$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+ 缩短的数组声明样式
$object = (object)[ 'member1' => "hello, I'm 1", 'member1o' => (object)['member1' => "hello, I'm 1o.1"], 'member2' => "hello, I'm 2", ];
两者将产生完全相同的结果:
stdClass Object
(
[member1] => hello, I'm 1
[member1o] => stdClass Object
(
[member1] => hello, I'm 1o.1
)
[member2] => hello, I'm 2
)
nJoy!
评论
您可以使用:
$object = (object)[]; // shorter version of (object)array();
$object->foo = 'bar';
深度转换的另一个选项是使用 +(默认情况下,它解码为 stdClass)。这样,您就不必在每个嵌套对象中重复强制转换。json_encode
json_decode
(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",
)));
输出:
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
)
评论
从这个答案到一个类似的问题:
从 PHP7 开始,我们有匿名类,它允许您在运行时扩展类,包括设置其他属性:
$a = new class() extends MyObject {
public $property1 = 1;
public $property2 = 2;
};
echo $a->property1; // prints 1
它不像数组的初始值设定项那样简洁。不确定我是否会使用它。但这是您可以考虑的另一种选择。
上一个:如何隐藏批处理输出
评论
::fromArray(...)