PHP. ООП. Абстрактные классы и интерфейсы

Главная » Видеоуроки » PHP » PHP. ООП. Абстрактные классы и интерфейсы
В сегодняшнем уроке мы рассмотрим абстрактные классы и интерфейсы в php, а также обсудим различия между ними.
Абстрактные классы в php реализуются добавлением ключевого слово abstract. Абстрактные классы могут иметь свойства и методы. Но в отличии от обычных классов, методы в абстрактных классах не имеют тела. Ключевое значение в таких методах — необходимость их реализации в дочерних классах.

Интерфейс — это тот же абстрактный класс, но у него нет свойств. Интерфейс объявляется при помощи ключевого слова interface.

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

Различие в применении абстрактного класса и интерфейса — очень тонкий вопрос. Абстрактный класс скорее служит для объединения семейства классов. Например, есть абстрактный класс Автомобиль, и от него наследуются классы Ford, Toyota, у которых есть общие методы (объявленные в абстрактном классе).
Но если появляется класс Велосипед, то в нем нет смысла реализовывать, например, метод ПоменятьМасло. Для таких классов лучше описывать интерфейсы.

Код урока (абстрактный класс)

<?php

/**
 *  Абстрактный класс обязует наследуемые от него классы
**  реализовывать все абстрактные методы
 */
abstract class Transport
{

    public $driverName = "Водила"; // свойства не могут быть абстрактными

    abstract function driverSide();
    abstract protected function changeOil(); // метод не может быть private

    // в абстрактном классе могут быть и обычные методы
    public function sayHello() {
        echo "Привет вам из метода";
    }


}

class Car extends Transport {

    public $wheels = 4;

    public function countWheels() {
        echo "У машины " . $this->wheels . " колеса";
    }

    public function driverSide() {
        echo $this->driverName . " сидит за рулем слева";
    }

    public function changeOil() {
        echo "В машине надо обязательно менять масло";
    }

}

class Bike extends Transport {

    public $wheels = 2;

    public function countWheels() {
        echo "У велосипеда " . $this->wheels . " колеса";
    }

    public function driverSide() {
        echo $this->driverName . " просто сидит за рулем";
    }

    public function changeOil() {
        echo "В велосипеде надо обязательно менять масло...Да ладно?";
    }

}

$car = new Car();
$bike = new Bike();

/*Посмотрим на объекты*/
echo "<pre>";
    print_r($car);
echo "</pre>";

echo "<pre>";
    print_r($bike);
echo "</pre>";

$car->countWheels();
echo "<br>";
$bike->countWheels();
echo "<br>";
$car->driverSide();
echo "<br>";
$bike->driverSide();
echo "<br>";
$car->changeOil();
echo "<br>";
$bike->changeOil();
echo "<br>";
$car->sayHello();
echo "<br>";
$bike->sayHello();

Код урока (интерфейс)

<?php

interface Oilable {
    public function changeOil();
}

interface Doorable {
    public function countDoors();
}

class Car implements Oilable, Doorable {

    public $wheels = 4;

    public function countWheels() {
        echo "У машины " . $this->wheels . " колеса";
    }

    public function changeOil() {
        echo "Пора менять масло";
    }

    public function countDoors() {
        echo "В машине 2 или 4 двери";
    }

}

class Bike {

    public $wheels = 2;

    public function countWheels() {
        echo "У велосипеда " . $this->wheels . " колеса";
    }


}

$car = new Car();
$bike = new Bike();

/*Посмотрим на объекты*/
echo "<pre>";
    print_r($car);
echo "</pre>";

echo "<pre>";
    print_r($bike);
echo "</pre>";

$car->countWheels();
echo "<br>";
$bike->countWheels();
echo "<br>";
$car->changeOil();
echo "<br>";
$car->countDoors();

2 комментария

  1. Руслан

    class Bike не подключил к интерфейсу, вот он и не требует реализовывать его методы.

    Ответить

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.

Pin It on Pinterest

Share This