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) { ...
仍然这不是最好的主意,因为很难以可预测的方式使用您的代码,因为有时您的论点会被忽略。不严格遵循接口定义也是不好的做法。
回复您的问题:no.
接口应该提供所有 children 必须遵守的 "contract"。因此,通过做额外的事情来打破合同可能不是一个好主意。
另一种选择是为附加参数提供 public setter,然后通过 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()
来覆盖所有的基础而不是加载大量的 类 会更整洁。
我有一个问题,接口中的方法可以像抽象方法一样在实现过程中获取额外的参数吗?例如:
<?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) { ...
仍然这不是最好的主意,因为很难以可预测的方式使用您的代码,因为有时您的论点会被忽略。不严格遵循接口定义也是不好的做法。
回复您的问题:no.
接口应该提供所有 children 必须遵守的 "contract"。因此,通过做额外的事情来打破合同可能不是一个好主意。
另一种选择是为附加参数提供 public setter,然后通过 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()
来覆盖所有的基础而不是加载大量的 类 会更整洁。