PHP - 访问没有区分大小写的对象属性?

时间:2010-02-12 13:39:00

标签: php object properties

我正在开发一个旧应用程序,其中使用的命名约定存在很多不一致之处。

有没有办法访问忽略区分大小写的对象属性?

例如,我有一个名为currentuser的对象,其属性为Name。

有没有办法像这样检索这个值?

$currentuser->name

任何建议表示赞赏。

感谢。

4 个答案:

答案 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;