Каковы компромиссы использования методов доступа против открытых переменных в php - PullRequest
0 голосов
/ 13 сентября 2010

Я ищу совет / опыт использования открытых переменных против закрытых переменных с методами доступа в php.

например, $ obj-> foo = 'a';echo $ obj-> foo;

против $ obj-> setFoo ('a');echo $ obj-> getFoo ();

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

Другой вариант -хранить переменные в массиве и использовать магические методы (набор __get / __) для доступа к ним - тогда у меня есть простота использования открытых переменных с возможностью рефакторинга или методов доступа.

Любой опыт или ссылки на чтолюди делают в мире php.

И для любого, кто владеет методом доступа, есть лучший способ, есть ли действительная потребность / использование для открытых переменных?

Ответы [ 4 ]

7 голосов
/ 13 сентября 2010

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

Самым большим преимуществом методов доступа является то, что вы можете использовать свой метод set для проверки значений и отклонения неуместных значений (например, пытаясь установить свойство, которое всегда должно быть целым числом в строке или массиве) ... но только эта проверка работает, если внешний код не может получить доступ к свойству напрямую.

Второе преимущество, если ваш код имеет связанные свойства, когда изменение свойства A также требует изменения свойства B ... если свойства общедоступны, вы не можете контролировать (или применять) это.

Использование методов set позволяет реализовать свободный интерфейс или более чистый код для таких примеров, как:

echo $obj->setFoo('a');

вместо

$obj->setFoo('a'); echo $obj->getFoo();

если вы включаете возврат в свой метод set

0 голосов
/ 17 марта 2014

Сеттеры и геттеры являются одним из видов реализации для инкапсуляции, одним из принципов ООП, который гласит, что объект должен быть черным ящиком, просто демонстрирующим поведение и его состояние своим клиентам, но предотвращающим раскрытие его внутреннего.Это позволяет использовать код с низкой связью, так как вы можете изменить логику внутри Setter и / или Getter, не влияя на код клиента с помощью вашего API.

Как уже говорили многие другие, существуют другие реализации, такие как магические методы.

0 голосов
/ 13 сентября 2010

сеттеры и геттеры всегда являются лучшим вариантом, потому что они обеспечивают большую стабильность для проверки / очистки.

public function __call($name,$params = array())
{
    if(strstr('set',$name))
    {
    }//returns

    if(strstr('get',$name))
    {
    }//Returns

    if(strstr('run',$name))
    {
    }//Returns
}
0 голосов
/ 13 сентября 2010

Getters / Setters возникли в Java. Им не место в скриптовых языках, поэтому они недовольны, например, например, Python и Javascript. Они делают API более удобным.

Как вы уже знаете, вы можете использовать __get для переноса доступа к переменным. Это желательно в скриптовых языках. Это позволяет вам, например, проверяйте типы в центральном расположении, у вас нет дублированного кода в нескольких методах установки / получения.

 function __set($name, $value) {
     if (gettype($value) == $this->_types[$name]) {
          $this->_vars[$name] = $value;
     }
 }   // instead of twenty methods checking the type

Запах кода для реализации полых методов получения / установки, чтобы иметь корпоративный код. И также нежелательно иметь геттеры / сеттеры с побочными эффектами. Всегда используйте реальные методы / сообщения для сложных операций с объектами.

...