支持多个PHP版本签名

4

我正在使用一个 PHP 库,它有以下功能:

public function call(\Phalcon\Mvc\Micro $application);

但在这个库的旧版本中,此函数是这样实现的:
public function call($application);

当我在我的代码中实现这个函数时,我需要根据我正在使用的库的版本更改已实现函数的签名。如何支持两个版本而无需为每个版本构建两个版本的代码?

你想实现一个继承库类并带有call方法的类吗? - Vasily
是的,我做了那个,但是实现的函数签名根据基础库而异。如果我使用旧版本的库,则没有参数类型限制,但是当我使用新版本时,我必须指定参数类型,否则我的代码将在运行时出错。 - Anas Salman
我在我的本地机器上尝试覆盖扩展类中的方法(使用php 5.5),并且它可以工作-我用func($a)覆盖了func(array $a)。我认为在php的早期版本中无法这样做。此外,我发现了这个问题-https://dev59.com/qmYr5IYBdhLWcg3wvsvR,它声称这是Liskov替换原则的违反。 - Vasily
为什么需要支持两个版本? - Romain Lanz
1个回答

2

我最终做了以下事情, 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- 然后我基于正确的接口实现了这个类两次,但实际调用将在调用者类中进行:

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);
    }

}

如果有更好的解决方案,请与我们分享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接