【问题标题】:PHP - Access object properties without case sensitivity?PHP - 访问不区分大小写的对象属性?
【发布时间】:2011-01-16 03:55:43
【问题描述】:

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

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

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

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

$currentuser->name

任何建议表示赞赏。

谢谢。

【问题讨论】:

  • 部分。数据库字段名称也有很多不一致的地方,这使事情变得更加复杂。

标签: php object properties


【解决方案1】:

好吧,你可以为你的每个类编写一个__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,因为我想提出相同的建议。你打败了我。如果根本找不到该属性,我会让它抛出一个异常。
  • 谢谢,我宁愿不必这样做,但至少在短期内我没有太多选择。
【解决方案2】:

有趣的问题。有两种可能的方法来实现你想要的。您可以使用 foreach 对数组进行交互,或者查看 php 反射功能 (http://www.php.net/manual/en/book.reflection.php)。

【讨论】:

    【解决方案3】:

    如果您无法控制对象(可能是来自外部数据库的一行),我建议您在访问这些行之前找出正确的名称。下面的函数不是一个便宜的操作,只是第一次做,它可以让你的应用更稳定。

    function findPropertyNameCaseInsensitive($obj, $name)
    {
      $propertyNames = array_keys(get_object_vars($obj));
      foreach($propertyNames as $propertyName)
      {
        if (strcasecmp($name, $propertyName) == 0)
          return $propertyName;
      }
      return NULL;
    }
    

    【讨论】:

      【解决方案4】:

      我知道这是一篇旧帖子,但我想我会在那里提出另一个解决方案。我最初尝试了 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;
      

      【讨论】:

      • 喜欢它使用原生 PHP 函数!
      猜你喜欢
      • 2016-05-12
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多