тип возвращаемого контейнера из подкласса

У меня есть библиотека 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 или что-то?


Редактировать: Нашел один способ сделать это:

  1. Удалить наследство,
  2. Создать переменную экземпляра родительского класса,
  3. использование __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;
}
}

Есть ли лучший способ?

1

Решение

Один правильный способ сделать это:

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 позволяет использовать класс экстендера при каждом вызове. Таким образом, вы можете переопределить функцию, используя другие методы родительского класса с возможностью цепочки.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]