PHP:使用下划线替换对象变量中的虚线

dpr*_*ite 3 php object

我有一个来自外部源的PHP对象(使用PEAR的XML_Serializer).一些变量在名称中有破折号,如:

<?php
  $company->{'address-one'};
Run Code Online (Sandbox Code Playgroud)

我只是想知道通过这个对象的最佳方法是什么,并用下划线替换破折号重命名对象属性,这样我就不必处理愚蠢的卷曲和引号.

nic*_*ckf 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});
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


nic*_*ckf 6

我只是想到了另一种方式:

使用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"
Run Code Online (Sandbox Code Playgroud)

当然,您必须找到一些方法将这些方法实际附加到元素的类中.我对这种事情不太满意,但也许它可以通过使用PHP的Reflection函数或创建一个包装类来工作.