Как реализовать доступ к свойствам в стиле ->get*()?

Повсеместно рекомендуют не работать со свойствами объектов напрямую, а обращаться к ним через методы ->get*() и ->set*(), даже когда не нужна никакая проверка/обработка передаваемых значений.
Также нашел на просторах статью, где один умелец рекомендует, например, вместо установки для каждого свойства методов get, соорудить метод __call, который будет возвращать значение нужного свойства по маске. Вот примерная реализация такой штуки (с исключениями при несуществующих методах/свойствах):

public function __call($method, $arguments)
{
    if (preg_match('/^get/', $method)) {
        $property = strtolower(substr($method, 3));
        if (property_exists($this, $property)) {
            return $this->$property;
        } else { 
            throw new Exception("Trying to access non-existent method '$method'");
        }
    } else {
        throw new Exception("Trying to access non-existent method '$method'");
    }
}


Вопрос - нафига такое сооружать, если можно сделать метод getProperty('property_name'). Разве такой вариант не будет лучше? И вообще, адекватные ли это решения?
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 2
He11ion
@He11ion
PHP-monkey
Код в примере кривой - неумелые ветвления с дублированием кода, регулярки вместо поиска подстроки, путаница методов и атрибутов. Да и в пхп есть стандартный магический метод __get (и __set) для всей этой вакханалии.
Мое резюме - типичный велосипед от быдлокодера, не нужен от слова совсем.
Ответ написан
ну так можно короче обращаться к свойствам
getStatus например вместо getProperty('status')

вот в мадженте чуть ли не все наследуется от Varien_Object, там вот так сделано
public function __call($method, $args)
    {
        switch (substr($method, 0, 3)) {
            case 'get' :
                //Varien_Profiler::start('GETTER: '.get_class($this).'::'.$method);
                $key = $this->_underscore(substr($method,3));
                $data = $this->getData($key, isset($args[0]) ? $args[0] : null);
                //Varien_Profiler::stop('GETTER: '.get_class($this).'::'.$method);
                return $data;

            case 'set' :
                //Varien_Profiler::start('SETTER: '.get_class($this).'::'.$method);
                $key = $this->_underscore(substr($method,3));
                $result = $this->setData($key, isset($args[0]) ? $args[0] : null);
                //Varien_Profiler::stop('SETTER: '.get_class($this).'::'.$method);
                return $result;

            case 'uns' :
                //Varien_Profiler::start('UNS: '.get_class($this).'::'.$method);
                $key = $this->_underscore(substr($method,3));
                $result = $this->unsetData($key);
                //Varien_Profiler::stop('UNS: '.get_class($this).'::'.$method);
                return $result;

            case 'has' :
                //Varien_Profiler::start('HAS: '.get_class($this).'::'.$method);
                $key = $this->_underscore(substr($method,3));
                //Varien_Profiler::stop('HAS: '.get_class($this).'::'.$method);
                return isset($this->_data[$key]);
        }
        throw new Varien_Exception("Invalid method ".get_class($this)."::".$method."(".print_r($args,1).")");
    }


очень даже удобно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы