Наследование на примере PHP

Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Наследование на примере PHP

Дочерние классы наследуют методы и свойства родительских классов. Все, кроме private.

Основываясь на всем этом, напишем класс для выставления оценок в школе.

Класс будет маленький, только для общего представления о наследовании.

Не будем обращать внимание, что оценка выставляется сразу целому классу, а не конкретному ученику. На самом деле мне было лень писать что-то большее. Да и вам так понятнее будет.



Сразу скажу, что в коде есть русский язык. По этому мне понадобилось добавить такой кусочек кода для нормальной работы.
Если кому то более интересно, стоит почитать про поддержку русского языка средствами PHP.

И так приступим:

<?php
header("Content-Type: text/html; charset=UTF-8");

abstract class Assessment
{
    protected $assessment; // Оценка
    const BEASTLY = 1; // Ужасно, отвратительно
    const BAD = 2; // Плохо
    const SATISFACTORY = 3; //Удовлетворительно
    const GOOD = 4; // Хорошо
    const EXCELLENT = 5; // Великолепно
    
    // Конструктор
    function __construct($assessment) {
        $this->assessment = $assessment;
    }
    
    // Полученая оценка
    function cost() {
        switch ($this->assessment) {
            case self::BEASTLY :
                return 1;
                break;
            case self::BAD :
                return 2;
                break;
            case self::SATISFACTORY :
                return 3;
                break;
            case self::GOOD :
                return 4;
                break;
            case self::EXCELLENT :
                return 5;
                break;
            default : 
                return 3;
        }
    }
        
    // Текст, описывающий полученую оценку
    function stringType() {
        switch ($this->assessment) {
            case self::BEASTLY :
                return "Единица. Ужасно!";
                break;
            case self::BAD :
                return "Два, очень плохо!";
                break;
            case  self::SATISFACTORY :
                return "Три, удовлетворительно!";
                break;
            case self::GOOD :
                return "Четыре, хорошо!";
                break;
            case self::EXCELLENT :
                return "Пять, великолепно!";
                break;
            default :
                return "Три, удовлетворительно!";
        }
    }
}

// Первый А класс
class First_a extends Assessment
{
    //Специфические реализации для класса
}

// Первый B класс
class First_b extends Assessment
{
    //Специфические реализации для класса
}

// Вывод информации по первому классу
$first_class = new First_a(Assessment::EXCELLENT);
echo $first_class->cost()." ".$first_class->stringType()."<br />\n";

// Вывод информации по второму классу
$second_class = new First_b(Assessment::GOOD);
echo $second_class->cost()." ".$second_class->stringType()."<br />\n";


У нас есть класс Assessment (Оценка).
В нем содержатся константы оценок:
    const BEASTLY = 1; // Ужасно, отвратительно
    const BAD = 2; // Плохо
    const SATISFACTORY = 3; //Удовлетворительно
    const GOOD = 4; // Хорошо
    const EXCELLENT = 5; // Великолепно


А так-же 2 метода. cost и stringType.
Метод cost возвращает полученную оценку в виде значения.
Метод stringType возвращает описание полученной оценки в виде строки.

В конструктор мы передаем константу, которая нам необходима.
Разберем на пимере первого А класса(Он у нас кстати является дочкой класса Assessment).
class First_a extends Assessment

Идем далее:
$first_class = new First_a(Assessment::EXCELLENT);
echo $first_class->cost()." ".$first_class->stringType()."<br />\n";

Мы создали экземпляр класса First_a (Первый А класс), в который передали Assessment::EXCELLENT оценку, а именно константу EXCELLENT, класса Assessment.
После чего запросили метод cost и stringType.
$first_class->cost()." ".$first_class->stringType()."<br />\n";

Эти методы вернут нам такое значение:
5 Пять, великолепно!


Прошу заметить, что в классе First_a не содержится никакого кода. Все потому, что код и методы берутся из его родительского класса Assessment.

Теперь вы спросите, а нафэга нам нужно так изламывать код?
Отвечу. Эта статья была представлена просто как пример наследования. И я бы не старался использовать наследование именно в таких целях! В данном коде к тому же много ненужного дублирования.
Всем спасибо!
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.