PHP:用下划线替换对象变量中的破折号

3
我有一个来自外部来源(使用PEAR的XML_Serializer)的PHP对象。一些变量的名称中带有破折号,例如:
<?php
  $company->{'address-one'};

我只想知道遍历该对象并将破折号替换为下划线以重命名对象属性的最佳方法,这样我就不必处理愚蠢的大括号和引号。

2个回答

7

使用get_object_vars()循环遍历它们,并根据需要进行替换:

function replaceDashes (&$obj) {
    $vars = get_object_vars($obj);
    foreach ($vars as $key => $val) {
        if (strpos($key, "-") !== false) {
            $newKey = str_replace("-", "_", $key);
            $obj->{$newKey} = $val;
            unset($obj->{$key});
        }
    }
}

7
我想到了另一种方法:
使用PHP5的魔术方法__get和__set,可以使下划线属性看起来存在,但实际上并不存在。这样做的好处是,如果有其他代码不希望字段名称被转换,它们仍然能正常工作:
function __get($var) {
    if (strpos($var, '-') !== false) {
        $underscored = str_replace("-", "_", $var);
        return $this->$underscored;
    }
}
function __set($var, $val) {
    if (strpos($var, '-') !== false) {
        $underscored = str_replace("-", "_", $var);
        $this->$underscored = $val;
    }
}

echo $company->{'address-one'};  // "3 Sesame St"
echo $company->address_one;    // "3 Sesame St"

// works as expected if you somehow have both dashed and underscored var names
// pretend: $company->{'my-var'} ==> "dashed", $company->my_var ==> "underscored"
echo $company->{'my-var'};  // "dashed"
echo $company->my_var;    // "underscored"

当然,你需要找到一种方法将这些方法实际附加到元素的类上。我不太擅长这种事情,但也许可以使用PHP的反射函数或创建一个包装类来实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接