支持多个php签名

支持多个php签名,php,function,types,Php,Function,Types,我使用的是一个php库,它具有以下功能: public function call(\Phalcon\Mvc\Micro $application); 但在该库的旧版本中,此函数类似于: public function call($application); 因此,当我在代码中实现这个函数时,我必须根据我正在使用的库的版本更改已实现函数的签名。 我如何支持这两个版本,而不需要为每个版本构建两个版本的代码?我最后做了以下工作, 1-首先,我创建了一个工厂,以获得基于phalcon版本的正确实现

我使用的是一个php库,它具有以下功能:

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替换原则。为什么需要支持这两个版本?