Я хотел бы скрыть родительские методы каким-то образом, чтобы метод магии __call дочернего класса был вызван для методов, определенных для родителя. Например:PHP: переопределение родительских методов с __call
class C {
function foo() { echo "foo\n"; }
}
class D extends C {
function __call($method, $args) { echo "called $name\n"; }
}
$d = new D();
$d->foo();
// desired result: called foo
// actual result: foo
Я проверил в rename_function и override_function но те не работают методы. ReflectionMethod имеет метод setAccessible, который я пытался, но это работает, только если вы используете экземпляр ReflectionMethod для вызова метода.
Фон: попытка иметь прокси-сервер RPC, который может использовать проверку типов PHP. Итак, если у меня есть RPCFoo, я могу использовать тип hinting или instanceof для принудительного ввода типа таким образом, чтобы я мог проверить это (экземпляр $ RPCFoo Foo).
Редактировать: базовый класс должен быть использован как есть, без прокси. Это значит, что проксирование может быть частью конфигурации системы, а не кода. Подумайте о нескольких серверах с одинаковой базой кода, но о возможности назначать определенные задачи каждому. Если локальный сервер не обрабатывает запрошенную службу, загрузчик классов возвращает прокси вместо базового класса. Если локальный сервер обрабатывает запрошенную службу, он возвращает базовый класс.
Edit Again: представленные методы являются работоспособными, но скрывают разработанный интерфейс базового класса от IDE и отражения. Я пытался сделать прокси-реализацию чистой, так что просто нужно было наследовать от базового класса и реализовать прокси-интерфейс. Чтобы поддерживать интерфейс базового класса, разработчик прокси должен будет повторно реализовать все общедоступные и защищенные методы для удаленного вызова. Затем, когда что-то обновляется в базовом классе, прокси должен также быть обновлен. В конце концов, я думаю, что я просто собираюсь идти по пути создания генератора прокси-сервера, который использует отражение для разработчика.
Спасибо за ответы!
Тогда базовый класс не может использоваться без прокси. –
Это может быть, но вы должны добавить метод magic '__call' в родительский класс и вызвать из него вызываемые методы. См. Мой отредактированный ответ –
trigger_error ... в 2012 году ... Использовать исключения;) – meze