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 может определять значения констант, отличные от его родительского класса или интерфейса.