Возможно, более современный ответ на 2016 год, похоже, теперь есть как минимум 3 варианта:
Вариант 1. Использование runkit
Ссылка: http://php.net/manual/en/function.runkit-class-emancipate.php
bool runkit_class_emancipate ( string $classname )
"Преобразование унаследованного класса в базовый класс, удаление любого метода, область действия которого является наследственной"
Хотя я сам не проверял это, это кажется приемлемым вариантом, если у вас есть контроль над загруженными расширениями. Недостатком здесь будет то, что вы потеряете все наследственные методы.
Вариант 2. Использование runkit, снова
Ссылка: http://php.net/manual/en/function.runkit-method-redefine.php
bool runkit_method_redefine ( string $classname , string $methodname , string $args , string $code [, int $flags = RUNKIT_ACC_PUBLIC ] )
«Динамически изменяет код данного метода»
Это решает проблему варианта 1, если ваша цель состоит в том, чтобы настроить метод или два в базовом классе.
Вариант 3. Реализация автозагрузчика
Ссылка: http://php.net/manual/en/function.spl-autoload-register.php
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
"Зарегистрировать данную функцию как реализацию __autoload ()"
Это лично мой любимый из 3, потому что:
- Работает изначально в современных версиях PHP
- Может работать в сочетании с другими автозагрузчиками
- Позволяет реализовать условную логику вокруг ваших переопределений
Это также тот, для которого у меня есть есть некоторый опыт. Пример реализации выглядит следующим образом:
// Some early point in your application
// Ideally after other autoloaders have registered
spl_autoload_register('autoload_override');
function autoload_override($class) {
if ($class == 'TargetClassName') {
include '/path/to/overriding/class.php';
}
}