【发布时间】:2009-09-17 00:30:35
【问题描述】:
我有一个来自外部源的 PHP 对象(使用 PEAR 的 XML_Serializer)。一些变量的名称中有破折号,例如:
<?php
$company->{'address-one'};
我只想知道通过这个对象并用下划线替换破折号重命名对象属性的最佳方法,这样我就不必处理愚蠢的卷曲和引号。
【问题讨论】:
我有一个来自外部源的 PHP 对象(使用 PEAR 的 XML_Serializer)。一些变量的名称中有破折号,例如:
<?php
$company->{'address-one'};
我只想知道通过这个对象并用下划线替换破折号重命名对象属性的最佳方法,这样我就不必处理愚蠢的卷曲和引号。
【问题讨论】:
使用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});
}
}
}
【讨论】:
我只是想到了另一种方式:
使用 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 的反射函数或通过创建一个包装类来工作。
【讨论】: