我有一些改变某些对象和值的属性,以这种格式应用:
$toApply = array(
"post.author.status.time" => 0,
"page.title" => "My title",
"page.tags" => "My, Tags"
)
我有对象$post
和$page
是stdClass对象,因此我可以轻松编写像$page->title = "My title"
我也知道我可以通过
来做到这一点$prop = "title";
$page->{$prop} = "My title"
但它仅适用于1级对象。
问题是如何深入到对象内部(如果需要,如果对象例如没有任何属性,我也会创建所需的子属性,我已经"page.someprop.deeperprop.deepprop.title"
)
我的1级功能如下:
function applyProp($prop, $value, $obj) {
$forSureObj = (object) $obj;
$forSureObj->{$prop} = $value;
return $forSureObj;
}
答案 0 :(得分:1)
这是执行此操作的一些代码。很好的小运动。不知道如何调用它,但在这里你有一个示例函数来做它。
class TestClass
{
public $prop2 = "test";
}
class TestClass2
{
public $prop;
public function __construct()
{
$this->prop = new TestClass();
}
}
function deepProperty($obj,$property,$value = null)
{
$curObj = &$obj;
$properties = explode('.',$property);
while(count($properties) > 1)
$curObj = &$curObj->{array_shift($properties)};
if ($value != null)
$curObj->{$properties[0]} = $value;
return $curObj->{$properties[0]};
}
$object = new TestClass2();
deepProperty($object,"prop.prop2","not test");
echo deepProperty($object,"prop.prop2");