Наследование с помощью extends в php

Ключевое слово extends в языке программирования PHP используется для наследования свойств и методов одного класса от другого

    Наследование

    Дочерний класс наследует все общедоступные и защищенные методы, свойства и константы родительского класса. До тех пока эти методы не будут переопределены, они будут сохранять свою исходную функциоанльность
    Дочерний класс может реализовать дополнительную функциональность
    Закрытые методы родительского класса недоступны для дочернего класса. Дочерние методы могут повторно реализовывать закрытый метод без учета обычных правил наследования
    до PHP 8.0.0 к закрытым методам применялись ограничения final и static. Начиная с PHP 8.0.0, единственное ограничение закрытого метода, которое применяется - это конструкторы private final, поскольку это обычный способ «отключить» конструктор при использовании вместо него статичных фабричных методов
    Если не используется автозагрузка, классы должны быть объявлены до того, как они будут использоваться. Если класс расширяет другой, то родительский класс должен быть объявлен до наследующего класса. Это правило применяется к классам, которые наследуют другие классы или интерфейсы
    Не разрешается переопределять свойство чтения-записи с помощью readonly-свойства или наоборот


    До PHP 8.1.0 большинство внутренних классов или методов не объявляли свои типы возвращаемых значений и при их расширении допускался любой тип возвращаемого значения
    Начиная с PHP 8.1.0, большинство внутренних методов начали "предварительно" объявлять тип возвращаемого значения
    В этом случае тип возвращаемого значения методов должен быть совместим с расширяемым родителем; в противном случае выдаётся уведомление об устаревании

    #Переопределяющий метод объявляет неверный тип возвращаемого значения без уведомления об устаревании class MyDateTime extends DateTime { /** * @return DateTime|false */ #[\ReturnTypeWillChange] public function modify(string $modifier) { return false; } }
    extends

    Класс может наследовать только один класс
    Унаследованные константы, методы и свойства разрешается переопределять путем повторного определения с таким же именем как в родительском классе
    Метод или константу нельзя переопределить, если в родительском классе метод или константу определили с ключевым словом final
    Доступ к переопределенным методам и статическим свойствам родительского класса получают, когда ссылаются на них через parent::

    class SimpleClass { // Объявление свойства public $var = 'значение по умолчанию
    '; // Объявление метода public function displayVar() { echo $this->var; } } class ExtendClass extends SimpleClass { function displayVar() { echo "Расширенный класс
    "; parent::displayVar(); } } $extended = new ExtendClass(); #Расширенный класс $extended->displayVar(); #значение по умолчанию
    Правила совместимости сигнатур

    При определении метода сигнатура должна быть совместима с родительским методом
    Сигнатура совместима если она соответствует правилам вариантности, делает обязательный параметр необязательным, добавляет только необязательные новые параметры, не ограничивает, а только ослабляет видимость
    Данные правила не распространяются на конструкторы и сигнатуру private-методов

    class Base { public function foo(int $a) { echo "Допустимо<br>"; echo $a . "<br>"; } } class Extend1 extends Base { function foo(int $a = 5) { echo parent::foo($a); } } class Extend2 extends Base { function foo(int $a, int $b = 6) { echo parent::foo($a); } } $obj = new Base(); $obj->foo(2); #Допустимо 2 $obj1 = new Extend1(); $obj1->foo(); #Допустимо 5 $obj1->foo(2); #Допустимо 2 $obj2 = new Extend2(); #дочерний метод, который удаляет параметр или делает необязательный параметр обязательным, несовместим с родительским методом $obj2->foo(); $obj2->foo(1); $obj2->foo(2, 2);
    Источники
    Последнее изменение: 18.11.2024 14:36


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ