Магічні методи - методи з подвійним підкресленням, які PHP викликає сам у певних ситуаціях:
__construct,__destruct- створення й знищення об'єкта;__get,__set,__isset,__unset- звернення до недоступної (неіснуючої чи приватної) властивості;__call,__callStatic- виклик недоступного методу;__toString- перетворення на рядок;__invoke- виклик об'єкта як функції:$validator($value);__clone- післяclone;__serialize,__unserialize- серіалізація;__debugInfo- що показувати уvar_dump().
__get і __call - основа «магії» Eloquent: $user->email читає атрибут з масиву, $user->posts() - зв'язок, User::where(...) через __callStatic перенаправляється в query builder.
Чим вони небезпечні:
- Опечатки не ловляться.
$user->emialне дасть помилки компіляції - лишеnullчи виняток під час виконання. - IDE й статичний аналіз сліпі. Автодоповнення, «перейти до визначення», перевірка типів - не працюють без додаткових підказок (
@property,@methodу PHPDoc, ide-helper, Larastan). - Складно налагоджувати: незрозуміло, звідки береться значення.
- Продуктивність: магічний виклик повільніший за прямий (рідко має значення, але в гарячих циклах помітно).
Правило: у власному коді віддавати перевагу явним методам і властивостям. Магію - лише там, де вона дає великий виграш у зручності API (як ORM), і з PHPDoc-підказками для інструментів.