Ниже приведен очень упрощенный пример. Мне интересно, возможно ли это в PHP, и если да, какой будет правильный синтаксис.
class A{
private $func = null;
private default_func(){
return $this;
}
public function __construct(callable $user_func=null){
if($user_func){
$this->func = $user_func;
else{
$this->func = $this->default_func; ********* NOT WORKING ******
}
}
public function run(){
$this->func();*************** NOT WORKING IF USER DOES NOT GIVE def func
}
}
//NOT WORKING
$C = new A;
$C->run();
//WORKS
$D = new A(function(){echo 1;});
$D->run();
То, что я пытаюсь здесь, дать разработчику возможность отправлять функцию в класс для переопределения поведения по умолчанию.
Я полностью осознаю, что мог бы просто вызвать функцию по умолчанию в else, но, как уже было сказано, это слишком упрощенный пример. В действительности существует много функций по умолчанию.
Включите вашу функцию по умолчанию как замыкание, вот так
class A{
private $func = null;
public function __construct(callable $user_func=null){
if($user_func){
$this->func = $user_func;
else{
$this->func = function(){
return $this;
}
}
$this->func();
}
}
Ты можешь использовать call_user_func()
для вызова нужной вам функции. Это должно позволить вам управлять тем, кому вы хотите позвонить.
public function __construct(callable $user_func=null){
if($user_func){
$this->func = $user_func;
else{
$this->func = [$this, 'default_func'];
}
call_user_func($this->func);
}
Вы можете сделать так:
class A{
private $func = null;
private $default_func = function(){
return $this;
}
public function __construct(callable $user_func=null){
if($user_func){
$this->func = $user_func;
} else{
$this->func = $this->default_func;
}
$this->func();
}
}
но лучше
class A{
private $func = function(){
return $this;
};
public function __construct(callable $user_func=null){
if($user_func){
$this->func = $user_func;
}
$this->func();
}
}