PHP ООП Вопрос - PullRequest
       35

PHP ООП Вопрос

3 голосов
/ 29 марта 2011

Можно ли требовать, чтобы объекты в PHP 5.3 содержали определенные константы или свойства?Я немного читал об интерфейсной модели PHP, и кажется, что она работает только для абстрактных открытых методов, так что это правильно.Итак, я спрашиваю, есть ли способ иметь два объекта: объект A и объект B. Если объект B хочет расширить объект A, он должен содержать определенную константу или переменную.Как бы вы спроектировали этот тип архитектуры?Спасибо.

Ответы [ 4 ]

2 голосов
/ 29 марта 2011

http://php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces.constants

Возможно, чтобы интерфейсы имели константы. Константы интерфейса работают точно так же, как и константы класса, за исключением того, что они не могут быть переопределены классом / интерфейсом, который его наследует.

Константы интерфейса не могут быть переопределены наследованием классов. Константы класса могут быть переопределены, но не обязательны (даже если они объявлены в абстрактном классе). Абстрактные классы предназначены для реализации интерфейса , а не реализации . Константы подпадают под реализацию, а методы определяют интерфейс. Таким образом, хотя константы могут быть объявлены со значением по умолчанию в абстрактном классе, дочерний процесс должен решить, использовать их или переопределить, или нет.

Ваша лучшая альтернатива - использовать методы "getter", например ::

abstract class MyAbstract
{
    abstract public function getPropertyA();
    abstract public function getPropertyB();
}

Теперь любой класс, использующий extend MyAbstract, должен будет определить getPropertyA() и getPropertyB(), что гарантирует, что значения будут всегда доступны.

1 голос
/ 29 марта 2011

Да и нет.

Нет, потому что свойства - это детали реализации.Он вообще не является частью интерфейса (методы определяют интерфейс).Вы можете определить свойства (в классах) и константы (в классах или интерфейсах), но вы не можете пометить их как абстрактные и требовать, чтобы они были «реализованы» производными классами.

Да, поскольку интерфейс позволяет определять константычто также будут у всех производных классов (будьте осторожны с этим, см. вопрос @ Гордона ).Это «заставляет» классы иметь эти константы.Вы также можете «принудительно» передавать свойства производным классам, используя абстрактные классы или обычное наследование:

abstract class Foo {
   public $foo = 'bar';
   protected $bar = 'baz';
}

class Bar extends Foo {
   public funciton getBar() {
      return $this->bar;
   }
}

$bar = new Bar;
echo $bar->foo;      // bar
echo $bar->getBar(); // baz
0 голосов
/ 29 марта 2011

Хм, если Объект B расширяет Объект A, а Объект A содержит константу или переменную, тогда Объект B также будет содержать их, если переменная protected или public. Поэтому, если вы определяете переменную в Объекте A, даже если ее значение равно NULL, Объект B по определению также определит ее.

Вы не можете заставить Объект B реализовать константу, которая не унаследована от Объекта A. То же самое с интерфейсом - если B реализует интерфейс C, который содержит константы, он наследует их. Однако B может определять другие значения констант, чем его родительский класс или интерфейс.

0 голосов
/ 29 марта 2011

Объект A и Объект B должны быть классами, объекты - это экземпляры (классов), которые не могут быть расширены (я могу ошибаться, но ...).

Имея это в виду, вы можетескажем, класс B расширяет класс A, тогда, если вы хотите, чтобы класс B определил определенную константу, класс A должен реализовать интерфейс.Подробнее о php-интерфейсах .

...