Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:用下划线替换对象变量中的破折号_Php_Object - Fatal编程技术网

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

PHP:用下划线替换对象变量中的破折号,php,object,Php,Object,我有一个来自外部源的PHP对象(使用PEAR的XML_序列化程序)。某些变量的名称中有破折号,如: <?php $company->{'address-one'}; 根据需要使用并更换它们: function replaceDashes (&$obj) { $vars = get_object_vars($obj); foreach ($vars as $key => $val) { if (strpos($key, "-") !=

我有一个来自外部源的PHP对象(使用PEAR的XML_序列化程序)。某些变量的名称中有破折号,如:

<?php
  $company->{'address-one'};

根据需要使用并更换它们:

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

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

使用PHP5的神奇方法
\uuuu get
\uu 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的反射函数,或者通过创建一个包装器类来工作