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

#php #properties

#php #свойства

Вопрос:

У меня есть класс, который при создании его экземпляра заполняет свойство с помощью construct . Цель этого класса — описать магазин, поэтому его свойства будут защищены, потому что они принадлежат только этому классу.

Но проблема в том, что иногда мне нужно получить некоторую информацию об этом классе из свойств.

пример:

 class Shop {

  protected $name;

  protected $typology;

  protected $owners;

  protected $closed;

  public function __construct($name,$typology,$owners,$closed)
  {
       $this->name = $name;
       $this->typology = $typology;
       $this->owners = $owners;
       $this->close = $closed;
  }

}

$shop = new Shop("Name Shop","vegetarian",2,1);

$superMarket = SupermarketFactory::getInstance($shop);
  

Для класса Supermaket , который (создается через Factory), необходимо получить свойства магазина для работы.

Существует множество способов заставить это работать, но все решения, с моей точки зрения, немного запутанны. Я экспериментировал с этими способами:

  • Настройка геттеров и сеттеров — чтобы исключить этот способ, имея 20 свойств, мне нужно 40 методов. Скрипты неэффективны.

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

  • Использование Reflection кажется лучшим из вышеперечисленных способов, но все же требует слишком большой реализации для получения только свойств (я думаю)

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

Есть какой-либо шаблон проектирования, который помогает этой цели?

Возможно, я уже задавал что-то подобное в StackOverflow, но я рассмотрел вопрос и предложил лучший способ.

Ответ №1:

Вы можете определить список свойств, доступных через __get() и __set() в вашем классе docblock, используя @property тег, который должен сделать их видимыми для IDE

Смотрите http://www.phpdoc.org/docs/latest/for-users/phpdoc/tags/property.html и http://manual.phpdoc.org/HTMLSmartyConverter/PHP/phpDocumentor/tutorial_tags.property.pkg.html для справки и примеров

Комментарии:

1. Спасибо, это сработало, так вы думаете, что лучший способ сохранить этот класс с __get() помощью метода magic?

2. Я также не вижу никаких проблем с наличием отдельных геттеров и сеттеров; но если у вас есть 20 свойств с геттерами и сеттерами, вы, вероятно, достигли точки, когда вам все равно нужно немного разложить свой класс …. за исключением ORM и подобных, которые имеют свойства для структур базы данных, которые зависят отв зависимости от количества столбцов в таблицах базы данных (и которые, как правило, используют __get() и __set() в любом случае, обычно у вас не должно быть такого количества свойств ни в одном классе

3. Хорошо, спасибо за полезный ответ, но я все равно хотел бы оставить вопрос открытым, читая этот пост developers.google.com/speed/articles/optimizing-php это удерживает меня от использования геттеров и сеттеров

4. Использование всех магических методов, таких как __get(), __set(), __isset() и т.д., сопряжено с накладными расходами, но если вы на самом деле не определили, что это проблема в вашей собственной ситуации, не избегайте магических методов, где их целесообразно использовать только на основебеспокойство по поводу производительности …. используйте их там, где это уместно, и меняйте только тогда, когда видите, что это создает проблемы со скоростью (т. Е. Когда Вы используете их тысячи раз в каждом запросе). Для большинства приложений у вас будет намного более медленный код, чем несколько вызовов магических методов