PHP ООП Вопрос

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

4 ответа

Решение

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

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

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

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

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

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

И да и нет.

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

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

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

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

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

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

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

Другие вопросы по тегам