У меня есть вопрос, может ли метод из интерфейса получить дополнительные параметры во время реализации, как абстрактный метод? например:
<?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) { ...
Еще это не лучшая идея так как будет трудно использовать ваш код предсказуемым образом, так как иногда ваш аргумент будет просто проигнорирован. Также не рекомендуется строго следовать определению интерфейса.
Re ваш вопрос: нет.
Интерфейс должен обеспечивать «контракт», которого должны придерживаться все дети. Таким образом, было бы не очень хорошей идеей разорвать этот контракт, выполнив дополнительные действия.
Альтернативным вариантом является предоставление общего установщика для дополнительных параметров, а затем доступ к ним по свойствам в 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()
чтобы покрыть все ваши базы вместо того, чтобы загружать ваши классы с большим количеством из них.