我有一个我不想编辑的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;
}
}
还有更好的方法吗?
答案 0 :(得分:0)
这样做的一个正确方法是:
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
允许您在每次调用中使用扩展程序类。因此,您可以在具有链接功能的父类中使用其他方法时覆盖该函数。