Как добавить метод внутри класса конструктора в PHP?

у меня есть class A который нуждается в новом методе, если один из его аргументов установлен в true,

Класс А

Class A{

private $is_new_method;

public function __construct( $is_new_method = false, $new_method_name = "" ){

$this->is_new_method = $is_new_method;

if( $this->is_new_method ){
//TODO : add new method in this class based on $new_method_name
}
}

}

Я видел runkit_method_add но это необходимо (PECL runkit> = 0.7.0).

Обратите внимание: эта функция будет вызываться внутри ядра фреймворка следующим образом:

$foo = new A();
$foo->myNewFunction();

Так каков наилучший способ сделать это?

0

Решение

$a = new Inflector([
'foo' => function($val){echo sprintf('%s calls foo()', $val[0] ?? 'none!').PHP_EOL;},
'bar' => function($val){echo sprintf('%s calls bar()', $val[0] ?? 'none!').PHP_EOL;},
'baz' => function($val){echo sprintf('%s calls baz()', $val[0] ?? 'none!').PHP_EOL;},
]);

$a->foo('Ahnold');
$a->bar('Elvis');
$a->baz('Lerhman');
$a->theBreaks('Who');

class Inflector
{
private $methods = [];

public function __construct(array $methods)
{
$this->methods = $methods;

//var_dump($this->methods);
}

public function __call(string $methodName, $params)
{
if (isset($this->methods[$methodName])) {
$this->methods[$methodName]($params);
}

throw new InflectionDeceptionException();
}

}

class InflectionDeceptionException extends \Exception
{
public function __construct($message = "Say what?")
{
return parent::__construct($message);
}

}

https://3v4l.org/kLdOp

дает:

Ahnold calls foo()
Elvis calls bar()
Lerhman calls baz()
0

Другие решения

Спасибо, Джаред Фарриш!
Я нашел свое решение на основе вашей рекомендации.

Class A{

private $is_new_method;

private $new_method;

public function __construct( $is_new_method = false, $new_method_name = "" ){

$this->is_new_method = $is_new_method;

if( $this->is_new_method ){
$new_method = $this->make_my_new_method( $new_method_name );
}
}

private function make_my_new_method( $method_name ){
$functionName  = "foo_" . $method_name;
$$functionName = function ( $item ) {
print_r( $item );
}
return $$functionName;
}

public function __call( $method, $args){
if ( isset( $this->new_method ) ) {
$func = $this->new_method;
return call_user_func_array( $func, $args );
}
}

}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector