PHP: заменить штрихи в переменных объекта на подчеркивания - PullRequest
3 голосов
/ 17 сентября 2009

У меня есть объект PHP, поступающий из внешнего источника (используя PEAR XML_Serializer). У некоторых переменных есть тире в имени, как:

<?php
  $company->{'address-one'};

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

Ответы [ 2 ]

7 голосов
/ 17 сентября 2009

Прокрутите их все, используя 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});
        }
    }
}
6 голосов
/ 17 сентября 2009

Я просто подумал о другом способе:

Используя магические методы 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-функций Reflection или создания класса-оболочки.

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