【问题标题】:PHP - change object props by prop namePHP - 通过道具名称更改对象道具
【发布时间】:2014-10-07 00:58:50
【问题描述】:

我有一些属性数组可以更改某些对象和值,以便以这种格式应用:

$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;
}

【问题讨论】:

  • $obj->{$lvl1}->{$lvl2} 等?是这个意思吗?
  • 我知道,但是如何自动执行,因为我不知道参数的深度。我可以假设深度不会超过 10 并且对于每种情况都像你说的那样写我的代码,但它不是那么干净的解决方案(如果我找不到任何东西,我会这样做)
  • 您认为如何使用递归?每次按. 拆分字符串,如果没有更深的层次,则应用分配。
  • 所以这个字符串 post.author.title 会将值分配给该属性:post->author['title'] 是吗?

标签: php oop stdclass


【解决方案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");

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2017-05-09
    • 1970-01-01
    • 2019-04-28
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-04-08
    相关资源
    最近更新 更多