PHP 5中使用接口方法的附加参数


Additional parameters using interfaces methods in PHP 5

我有一个问题,从接口的方法可以像抽象方法一样在实现过程中获得额外的参数吗?例如:

<?php
interface Figures {
    public function setColor($color);
}
class Circle implements Figures {
    public function setColor($color, $additional_parameter, ...) {
    }
}

?>

不,它会给你一个这样的错误

Fatal error: Declaration of Circle::setColor() must be compatible with Figures::setColor($color)

您可以这样做,只要您使附加参数为可选的:

public function setColor($color, $additional_parameter = "defaultvalue", $another_parameter = null) { ...

仍然这不是最好的主意,因为很难以可预测的方式使用您的代码,因为有时您的参数将被忽略。不严格遵循接口定义也是不好的做法。

关于你的问题:没有

接口应该提供一个所有子接口都必须遵守的"契约"。因此,通过做额外的事情来打破这个契约可能不是一个好主意。

另一种选择是为附加参数提供一个公共设置器,然后通过setColor()中的属性访问它们:

interface Figures {
    public function setColor($color);
}
class Circle implements Figures {
    protected $_additionalParameter;
    public function setColor($color) {
        echo $this->_additionalParameter . ' - not passed in any more';
    }
    public function setAdditionalParameter($blah = '')
    {
        $this->_additionalParameter = $blah;
        return $this;
    }
}

和这样使用:

// you implement stuff
$circle = new Circle;
$circle->setAdditionalParameter('blah')
       ->setColor('color');
// blah - not passed in any more

如果你有很多额外的参数,你可能会发现使用神奇的方法__set()来覆盖你所有的基础,而不是用大量的参数加载你的类。