支持多个php签名
我使用的是一个php库,它具有以下功能:支持多个php签名,php,function,types,Php,Function,Types,我使用的是一个php库,它具有以下功能: public function call(\Phalcon\Mvc\Micro $application); 但在该库的旧版本中,此函数类似于: public function call($application); 因此,当我在代码中实现这个函数时,我必须根据我正在使用的库的版本更改已实现函数的签名。 我如何支持这两个版本,而不需要为每个版本构建两个版本的代码?我最后做了以下工作, 1-首先,我创建了一个工厂,以获得基于phalcon版本的正确实现
public function call(\Phalcon\Mvc\Micro $application);
但在该库的旧版本中,此函数类似于:
public function call($application);
因此,当我在代码中实现这个函数时,我必须根据我正在使用的库的版本更改已实现函数的签名。
我如何支持这两个版本,而不需要为每个版本构建两个版本的代码?我最后做了以下工作, 1-首先,我创建了一个工厂,以获得基于phalcon版本的正确实现:
class X
{
public static function getMiddleware(){
$oX = new X();
if ((int)\Phalcon\Version::getId()/1000000 >= 2) {
return new XV2($oX);
} else {
return new XV1($oX);
}
}
public function call($application)
{
// do your business here
}
}
2-然后我基于正确的接口实现了两次此类,但实际调用将在caller类中:
class XV1 implements MiddlewareInterface
{
private $_oX;
public function __construct($oX)
{
if (!isset($oX) || $oX == null){
throw new Exception("X couldn't be null or empty");
}
$this->_oX = $oX;
}
public function call($application)
{
return $this->_oX->call($application);
}
}
class XV2 implements MiddlewareInterface
{
private $_oX;
public function __construct($oX)
{
if (!isset($oX) || $oX == null){
throw new Exception("X couldn't be null or empty");
}
$this->_oX = $oX;
}
public function call(\Phalcon\Mvc\Micro $application)
{
return $this->_oX->call($application);
}
}
如果有人有更好的解决方案,请与我们分享您想实现一个类,该类使用call方法扩展库的类吗?是的,我这样做了,但实现的函数签名因基库而异,如果我使用旧版本的库,对参数类型没有限制,但是当我使用新版本时,我必须指定参数类型,如果我不这样做,我的代码将在运行时中断。我尝试在本地mashine上的扩展类中重写一个方法(在板上有PHP5.5),它可以工作-我用func($a)重写func(数组$a)。我认为在previos版本的php中无法做到这一点。我还发现了一个问题,它声称这违反了Liskov替换原则。为什么需要支持这两个版本?