【问题标题】:Additional parameters using interfaces methods in PHP 5PHP 5 中使用接口方法的附加参数
【发布时间】:2015-08-12 21:21:27
【问题描述】:

我有一个问题,接口中的方法能否像抽象方法一样在实现过程中获取额外的参数?例如:

<?php

interface Figures {

    public function setColor($color);
}

class Circle implements Figures {

    public function setColor($color, $additional_parameter, ...) {

    }
}

?>

【问题讨论】:

标签: php oop interface php-5.6 abstract-methods


【解决方案1】:

不,它会给你这样的错误

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

【讨论】:

  • 谢谢你的回答:)
【解决方案2】:

只要将附加参数设为可选,您就可以这样做:

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

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

【讨论】:

  • 谢谢你的回答,我不知道。
【解决方案3】:

你的问题:no.

接口应该提供所有孩子都必须遵守的“契约”。因此,无论如何,通过做额外的事情来打破合同可能不是一个好主意。

另一种选择是为附加参数提供公共设置器,然后通过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

如果您有很多额外的参数,您可能会发现使用 magic method __set() 覆盖您的所有基础而不是加载大量的类会更整洁。

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多