У меня есть библиотека PHP, которую я не хочу редактировать, и внедряю в свой код, расширяя / переопределяя некоторые методы. Но я застрял с цепью. Например:
class MomentPHP extends Moment {
public $uniqueSettings;
public function formatJS(){
return parent::format($this->uniqueSettings);
}
}
class Moment {
public function startOf(){
//some code
return $this;
}
}
Я хочу сделать это:
$momentphp = new MomentPHP();
$dateStart = $momentphp->startof('month')->formatJs();
И способ сделать это — переопределить все методы в дочернем классе внутри MomentPHP, чтобы вернуть себя.
Есть ли другой простой способ сделать это? как использование _call
или что-то?
Редактировать: Нашел один способ сделать это:
__call
метод переключения между классами.Как это:
class MomentPHP {
private $instance = null;
public $uniqueSettings;
public function __construct(){
$this->instance = new Moment();
}
public function __call($method,$args){
if(in_array($method, get_class_methods($this))){
call_user_func(array($this,$method),$args);
else
call_user_func(array($this->instance,$method),$args);
return $this;
}
public function formatJS(){
return $this->instance->format($this->uniqueSettings);
}
}
class Moment {
public function startOf(){
//some code
return $this;
}
}
Есть ли лучший способ?
Один правильный способ сделать это:
class MomentPHP {
private $instance = null;
public $uniqueSettings;
public function __construct(){
$this->instance = new Moment();
// settings etc.
}
public function __call($method,$args){
$result = NULL;
if(in_array($method, get_class_methods($this))){
$result = call_user_func(array($this,$method),$args);
else
$result = call_user_func(array($this->instance,$method),$args);
if($result instanceof Moment)
$this->instance = $result;
return $this;
}
public function format(){
return $this->instance->format($this->uniqueSettings);
}
}
Обновление экземпляра из результата метода является ключевой операцией, а использование $this
вместо $this->instance
позволяет использовать класс экстендера при каждом вызове. Таким образом, вы можете переопределить функцию, используя другие методы родительского класса с возможностью цепочки.
Других решений пока нет …