Каковы недостатки использования магических методов? как сокращать их в дочерних классах?

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

Итак, мои вопросы: КАК доктрина сократила магические методы? и каковы недостатки использования магических методов именно в ORM, таких как доктрина?


person Rupesh Patel    schedule 27.07.2012    source источник
comment
На какой вопрос вы хотите получить ответ? Тот, что в заголовке (каковы недостатки ..), или тот, что в конце основного текста (как доктрина сделала это ..)?   -  person SDC    schedule 27.07.2012
comment
@SDC У меня есть два отдельных вопроса, позвольте мне отредактировать мой вопрос   -  person Rupesh Patel    schedule 27.07.2012


Ответы (1)


  • Магический код трудно документировать и понять. Обычно вы должны добавить комментарий к каждой функции и использовать инструмент для создания
    документации. Магическими методами это не сработает.

  • Магические методы не поддерживают подсказку типа. Одно из самых больших преимуществ использования функций для установки свойств заключается в том, что вы можете использовать подсказку типа. Такой код

    публичная функция setUser(User $user){ this->user = $user}

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

  • IDE не поддерживают магические методы. Многие современные PHP IDE поддерживают автозаполнение. Функции и методы распознаются простым парсером. Этот синтаксический анализатор не может обнаруживать магические операции установки или вызова.

Я слышал, что магические методы медленнее, чем явные, но сам никогда не проверял.

Так как же это сделать без магии? Я использую шаблоны для генерации геттеров и сеттеров и обычно вообще не использую __call.

Магические методы — очень полезные инструменты для создания прокси-объектов и других специализированных инструментов, но вам НЕ СЛЕДУЕТ использовать их в каждом классе.

person Oliver A.    schedule 27.07.2012
comment
Спасибо за исчерпывающий ответ. Знаете ли вы, как заставить производные классы не использовать магические методы? - person Rupesh Patel; 27.07.2012
comment
магические методы вызываются только тогда, когда определенный метод или свойство не существует, поэтому, если вы реализуете все необходимые методы, магии не будет. - person Oliver A.; 27.07.2012