我有一个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
可以在每次调用中使用扩展程序类。因此,您可以在使用具有链接功能的父类中的其他方法时重写该函数。