#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() и т.д., сопряжено с накладными расходами, но если вы на самом деле не определили, что это проблема в вашей собственной ситуации, не избегайте магических методов, где их целесообразно использовать только на основебеспокойство по поводу производительности …. используйте их там, где это уместно, и меняйте только тогда, когда видите, что это создает проблемы со скоростью (т. Е. Когда Вы используете их тысячи раз в каждом запросе). Для большинства приложений у вас будет намного более медленный код, чем несколько вызовов магических методов