Componere
Componere - это расширение PHP 7, доступное на pecl и задокументированное в руководстве по PHP ...
Приведенный ниже код регистрирует определение в таблице записей класса:
<?php
/* just making the example standalone */
class Model {}
class Car extends Model {
public function something() {}
}
trait SaysVroomVroomWhenPoked {
public function poke() {
return "Vroom Vroom";
}
}
$def = new \Componere\Definition(Some\Place\Car::class, Car::class);
$def->addTrait(SaysVroomVroomWhenPoked::class);
$def->addMethod("newMethod", new \Componere\Method(function(){
return 42;
}));
$def->register();
$car = new \Some\Place\Car();
printf("%s and %d\n", $car->poke(), $car->newMethod());
?>
Регистрация класса в таблице записей может быть желательна в некоторых случаях, поскольку ее действие распространяется на весь период действия запроса.
Приведенный ниже код исправляет конкретный экземпляр объекта с необходимыми функциями:
<?php
/* just making the example standalone */
class Model {}
class Car extends Model {
public function something() {}
}
trait SaysVroomVroomWhenPoked {
public function poke() {
return "Vroom Vroom";
}
}
function accept(Car $car) {
$patch = new \Componere\Patch($car);
$patch->addTrait(SaysVroomVroomWhenPoked::class);
$patch->addMethod("newMethod", new \Componere\Method(function(){
return 42;
}));
$patch->apply();
printf("%s and %d\n", $car->poke(), $car->newMethod());
}
$car = new Car();
accept($car);
var_dump(method_exists($car, "newMethod")); # false
?>
Обратите внимание, что выполнение этого везде гораздо менее эффективно, чем изменение определения, но его побочные эффекты исчезают, когда возвращается функция accept.
http://php.net/componere
Примечание: он имеет интерфейс жидкости, но для ясности я не использовал его здесь ...
Edit:
Я только что заметил ваш комментарий, выражающий интерес к предварительной обработке кода или, возможно, к использованию анонимных классов, а не манипуляций во время выполнения. Использование анонимных классов - отличная идея, но я не думаю, что вам нужен пример этого ...
Полное раскрытие: я написал Componere, и я написал реализацию анонимных классов для PHP ...
Все, что я скажу, чтобы отговорить вас от предварительной обработки, вероятно, сейчас будет довольно пустым ...