2009-09-17 98 views
3

我有一個來自外部源的PHP對象(使用PEAR的XML_Serializer)。有些變量在名稱破折號,如:PHP:使用下劃線替換對象變量中的虛線

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

我只是想知道如何去通過這個對象和重命名用下劃線代替破折號對象屬性的最好辦法,所以我沒有處理愚蠢的捲髮和報價。

回答

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

當然,你必須要找到一些方法來真正將這些方法到你的元素的類。我對這類事情不太好,但也許它可以通過使用PHP的Reflection功能或創建包裝類來工作。