Ухх, это адовый изврат JS-styleна семерке зато, можно сходить по взрослому )
$foo->addEventHandler(new class($myActionHandler) implements FooEventHandler
{
private $myActionHandler;
public function __construct(MyActionHandler $myActionHandler)
{
$this->myActionHandler = $myActionHandler;
}
public function onAction(FooActionEvent $event)
{
$this->myActionHandler->handleEvent(new MyEvent($event->type, $event->data));
}
});
Ну в худшем случае - она и так будет, только в отдельных классах. В хорошем случае можно сделать фабрику анонимных классов.одноразовые адаптеры перерастут в гигантскую копипасту
их еще можно вместо final class использовать , и чистыми интерфейсами работать..Анонимные классы очень полезны для stub'ов в unit-тестах.
из кода cut, в новый файл paste и includeодноразовые адаптеры перерастут в гигантскую копипасту
идеалистиз кода cut, в новый файл paste и include
interface Foo{}
interface Bar{}
function getObj( $interfaces ){
$tmpfname = tempnam("/tmp", "FOO");
file_put_contents($tmpfname, "<"."?php
return new class implements ".implode(',', $interfaces)."{
public \$foo=\"bar\";
};");
$obj = include $tmpfname;
return $obj;
}
$obj = getObj(['Foo', 'Bar']);
print_r($obj);
print_r($obj instanceof Foo);
print_r($obj instanceof Bar);
exit;
кодогенерация жеблин как страшно то ))
$obj = new class{
private $a;
private $b;
public function result(){
return $this->a+$this->b;
}
};
// di
function inject($obj, $data){
return (function($data) {
foreach($data as $key => $val){
$this->$key = $val;
}
})->call( $obj, $data );
}
inject($obj, ['a' => 100,'b' => 200]);
$this->assertEquals(300, $obj->result());