PHP - Доступ к свойствам объекта без учета регистра? - PullRequest
5 голосов
/ 12 февраля 2010

Я работаю над старым приложением, в котором есть много несоответствий в используемых соглашениях об именах.

Есть ли способ получить доступ к свойствам объекта, который игнорирует чувствительность к регистру?

Например, у меня есть объект под названием currentuser с атрибутом Name.

Можно ли как-нибудь получить это значение?

$currentuser->name

Любой совет приветствуется.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 20 января 2011

Если у вас нет контроля над объектом (возможно, это строка из внешней базы данных), я бы порекомендовал выяснить правильные имена, прежде чем вы получите доступ к строкам. Приведенная ниже функция не является дешевой операцией, но выполняется только в первый раз, она может сделать ваше приложение более стабильным.

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 голосов
/ 12 февраля 2010

Ну, вы можете написать __get функцию для каждого из ваших классов, которая бы справилась с таким преобразованием, но это довольно хакерски. Примерно так может работать:

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

Но я бы сильно отговорил вас от такого подхода. В конечном итоге было бы намного разумнее просто преобразовать все переменные в единую схему именования.

0 голосов
/ 26 апреля 2015

Я знаю, что это старый пост, но я подумал, что я бы добавил другое решение. Сначала я попробовал подход 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;
0 голосов
/ 12 февраля 2010

Интересный вопрос. Есть два возможных способа достичь того, что вы хотите. Либо вы можете использовать foreach для перемещения по массиву, либо взглянуть на функции отражения php (http://www.php.net/manual/en/book.reflection.php).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...