oop — дополнительные параметры с использованием методов интерфейсов в PHP 5

У меня есть вопрос, может ли метод из интерфейса получить дополнительные параметры во время реализации, как абстрактный метод? например:

<?php

interface Figures {

public function setColor($color);
}

class Circle implements Figures {

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

}
}

?>

0

Решение

Нет, это даст вам такую ​​ошибку

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

Другие решения

Вы можете сделать это до тех пор, пока вы делаете дополнительные параметры необязательными:

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

Еще это не лучшая идея так как будет трудно использовать ваш код предсказуемым образом, так как иногда ваш аргумент будет просто проигнорирован. Также не рекомендуется строго следовать определению интерфейса.

2

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() чтобы покрыть все ваши базы вместо того, чтобы загружать ваши классы с большим количеством из них.

1
По вопросам рекламы [email protected]