我正在开发一个旧应用程序,其中使用的命名约定存在很多不一致之处。
有没有办法访问忽略区分大小写的对象属性?
例如,我有一个名为currentuser的对象,其属性为Name。
有没有办法像这样检索这个值?
$currentuser->name
任何建议表示赞赏。
感谢。
答案 0 :(得分:4)
好吧,你可以为你的每个类编写一个__get
函数来处理这样的转换,但它非常hacky。这样的事情可能有用:
class HasInconsistentNaming {
var $fooBar = 1;
var $Somethingelse = 2;
function __get($var) {
$vars = get_class_vars(get_class($this));
foreach($vars as $key => $value) {
if(strtolower($var) == strtolower($key)) {
return $this->$key;
break;
}
}
return null;
}
}
现在,你可以这样做:
$newclass = new HasInconsistentNaming();
echo $newclass->foobar; // outputs 1
如果您想稍微简化一下任务,可以让您的基类继承自提供此功能的类。这样您就不必将函数写入每个类:
class CaseInsensitiveGetter {
function __get($var) {
$vars = get_class_vars(get_class($this));
foreach($vars as $key => $value) {
if(strtolower($var) == strtolower($key)) {
return $this->$key;
break;
}
}
return null;
}
}
class HasInconsistentNaming extends CaseInsensitiveGetter {
var $fooBar = 1;
var $Somethingelse = 2;
}
但是我强烈反对你不采取这种方法。从长远来看,将所有变量转换为一致的命名方案会更加明智。
答案 1 :(得分:4)
如果您无法控制对象(可能是外部数据库中的一行),我建议您在访问行之前找出正确的名称。下面的功能不是一个便宜的操作,只是第一次完成,它可以使您的应用程序更稳定。
function findPropertyNameCaseInsensitive($obj, $name)
{
$propertyNames = array_keys(get_object_vars($obj));
foreach($propertyNames as $propertyName)
{
if (strcasecmp($name, $propertyName) == 0)
return $propertyName;
}
return NULL;
}
答案 2 :(得分:0)
有趣的问题。有两种方法可以达到你想要的效果。您可以使用foreach来遍历数组,也可以查看php反射功能(http://www.php.net/manual/en/book.reflection.php)。
答案 3 :(得分:0)
我知道这是一个老帖子,但我想我会抛出另一个解决方案。我最初尝试了get_class_vars方法,但决定转而使用array
,然后使用array_change_key_case
将密钥转换为小写。此时,您可以使用数组或转换回对象。我没有做任何基准测试,但我正在处理小物件。
function convertPropNamesLower($obj) {
return (object)array_change_key_case((array)$obj, CASE_LOWER);
}
//usage
$myObj = convertPropNamesLower($myObj);
echo $myobj -> myprop;