是否可以在php中为对象一次设置多个属性? 而不是做:
$object->prop1 = $something;
$object->prop2 = $otherthing;
$object->prop3 = $morethings;
做类似的事情:
$object = (object) array(
'prop1' => $something,
'prop2' => $otherthing,
'prop3' => $morethings
);
但没有覆盖对象。
答案 0 :(得分:16)
不喜欢你想要的方式。但这可以通过循环来完成。
$map = array(
'prop1' => $something,
'prop2' => $otherthing,
'prop3' => $morethings
);
foreach($map as $k => $v)
$object->$k = $v;
仅查看2条额外的行。
答案 1 :(得分:8)
你应该看看Object Oriented PHP Best Practices:
“由于setter函数返回$ this,你可以将它们链接起来:”
$object->setName('Bob')
->setHairColor('green')
->setAddress('someplace');
这恰好被称为fluent interface。
答案 2 :(得分:3)
我建议你不要这样做。说真的,不。
你的代码在第一种方式上更加清晰,你的意图更加清晰,并且你并没有把你的代码放在某种程度上,以至于将来某个人会看到你的代码并想到“这个白痴到底是什么”思考“?
如果你坚持做一些明显错误的事情,你总是可以创建一个数组,迭代它并在循环中设置所有属性。我不会给你代码。这是邪恶的。
答案 3 :(得分:2)
您可以为返回对象的对象编写一些setter:
public function setSomething($something)
{
$this->something = $something;
return $this; //this will return the current object
}
然后你可以这样做:
$object->setSomething("something")
->setSomethingelse("somethingelse")
->setMoreThings("some more things");
您需要为每个属性编写一个setter,因为__set
函数无法返回值。
或者,设置单个函数以接受property =>的数组。价值并设置一切?
public function setProperties($array)
{
foreach($array as $property => $value)
{
$this->{$property} = $value;
}
return $this;
}
并传入数组:
$object->setProperties(array('something' => 'someText', 'somethingElse' => 'more text', 'moreThings'=>'a lot more text'));
答案 4 :(得分:0)
我实际上不会这样做......但为了好玩,我会
$object = (object) ($props + (array) $object);
你最终得到一个由$ objects公共属性组成的stdClass,所以它失去了它的类型。
答案 5 :(得分:0)
方法objectThis()
将类数组属性或数组转换为stdClass。使用direct transtypage(object)将删除数字索引,但使用此方法将保留数字索引。
public function objectThis($array = null) {
if (!$array) {
foreach ($this as $property_name => $property_values) {
if (is_array($property_values) && !empty($property_values)) {
$this->{$property_name} = $this->objectThis($property_values);
} else if (is_array($property_values) && empty($property_values)) {
$this->{$property_name} = new stdClass();
}
}
} else {
$object = new stdClass();
foreach ($array as $index => $values) {
if (is_array($values) && empty($values)) {
$object->{$index} = new stdClass();
} else if (is_array($values)) {
$object->{$index} = $this->objectThis($values);
} else if (is_object($values)) {
$object->{$index} = $this->objectThis($values);
} else {
$object->{$index} = $values;
}
}
return $object;
}
}
答案 6 :(得分:0)
我意识到这是一个古老的问题,但为了其他人的利益,我最近自己解决了这个问题,并想分享结果
<?php
//Just some setup
header('Content-Type: text/plain');
$account = (object) array(
'email' => 'foo',
'dob'=>((object)array(
'day'=>1,
'month'=>1,
'year'=>((object)array('century'=>1900,'decade'=>0))
))
);
var_dump($account);
echo "\n\n==============\n\n";
//The functions
function &getObjRef(&$obj,$prop) {
return $obj->{$prop};
}
function updateObjFromArray(&$obj,$array){
foreach ($array as $key=>$value) {
if(!is_array($value))
$obj->{$key} = $value;
else{
$ref = getObjRef($obj,$key);
updateObjFromArray($ref,$value);
}
}
}
//Test
updateObjFromArray($account,array(
'id' => '123',
'email' => 'user@domain.com',
'dob'=>array(
'day'=>19,
'month'=>11,
'year'=>array('century'=>1900,'decade'=>80)
)
));
var_dump($account);
显然没有内置的安全措施。主要的警告是updateObjFromArray
函数假定对于$array
中的任何嵌套数组,$obj
中的相应密钥已经存在并且是对象,这必须是真的,或者像对象一样处理它会引发错误。
希望这有帮助! :)