Но время на чтение документации в итоге скомпенсируется ускорением разработки, не?
Вот код без магии:
class One {
function a(int $m): self
function b(int $n, int $p): self
function build(): Two
}
class Two {
function add (Listener $r): void
}
interface Listener {
function onSuccess(Success $s): void
}
class Success {
function getSender(): Two
function getRow(): Row
}
Сразу видно, какие есть методы с какими аргументами. Есть интерфейс Listener, точно описывающий слушатель. Есть автоподстановка и автопроверка IDE. Можно проверить статическим анализатором вроде Psalm, что все методы вызываются корректно и с правильными аргументами. При опечатке сразу получаем undefined method call. Можно по Ctrl+Click зайти в каждый метод и посмотреть его исходный код.
А это код с магией:
class One {
function __call($name, $vars) {
$f = new Fluent();
return ($f->$name)($vars)
}
}
class Fluent {
function __get($name)
function __set($name)
function __call($name, $vars)
}
class Two {
function add (callable $f): void
}
Какие методы есть у One и Fluent? Смотрим список методов в документации. С какими аргументами их вызывать? Ищем там же в документации. Какие параметры нужно принять в анонимной функции $f? Указано в документации.
В итоге программируем наугад и описание каждого метода ищем в документации. Опечатка в названии метода может не привести к ошибке, так как __call всеяден. IDE все методы подсвечивает жёлтым как не существующие. Автоподстановка и проверка не работает. Надо ставить продвинутый IDE Helper, который сгенерирует огроменный meta-файл для всего фреймворка. Но не факт, что всё сгенерирует правильно. По Ctrl+Click вместо реального метода теперь попадаем в PHPDoc метафайла. Также надо ставить огроменный плагин для Psalm.
---
Я про то, что без магии документацию можно прочитать всего один раз, а дальше всё видно по автоподстановке и по интерфейсам. А с магией придётся бегать туда по сотне раз в день чтобы посмотреть, какие параметры у каждого метода или анонимки.
Да, без магии нужно прописывать больше кода, объявляя каждый метод и интерфейс. Но этим экономим на небходимости ставить тонны хэлперов.