Storm-coder
4/3/2017 - 3:59 PM

Конструкторы и наследование

Конструкторы и наследование

<?php

    class ShopProduct {

        public $title;
        public $producerMainName;
        public $producerFirstName;
        public $price;

        function __construct ($title, $firstName, $mainName, $price) { // конструктор

            $this -> title              = $title; // через $this обращаюсь к свойству этого класса title и присваиваю ему значение (аргумент), которое прилетит в переменную $title, когда вызовется метод конструктора (вызывается при создании нового объекта)
            $this -> producerFirstName  = $firstName;
            $this -> producerMainName   = $mainName;
            $this -> price              = $price;

        }

        /*
            Meтoд  __construct ( ) вызывается,  когда создается объект с помощью оператора new.
            Значения всех перечисленных аргументов передаются конструктору.
            Благодаря конструктору, создание экземпляров класса ShopProduct и определение значений их свойств выполняются в одном операторе.
        */

        function getProducer () { // метод. возвр. имя и фам автора
            return "{$this -> producerFirstName} " .
                    "{$this -> producerMainName}";
        }

        function getSummaryLine () { // метод возвращает название альбома (или книги); имя, фамилию автора
            $base = "{$this -> title} ( {$this -> producerMainName}, ";
            $base .= "{$this -> producerFirstName} )";
            return $base;
        }

    }

                    /* Класс CDProduct (дочерний) расширяет возможности класса ShopProduct */

    class CDProduct extends ShopProduct {
        public $playLength;

        function __construct ($title, $firstName, $mainName, $price, $playLength) {

            parent:: __construct($title, $firstName, $mainName, $price);    // Вызвать мeтoд __construct ( ) родительского класса
                $this -> playLength = $playLength;

        }

        function getPlayLength() { // метод. возвращает время звучания
            return $this -> playLength;
        }

        function getSummaryLine () { // метод. возвращает название альбома; имя, фамилию автора и время звучания
            $base = "{$this -> title} ( {$this -> producerMainName}, ";
            $base .= "{$this -> producerFirstName} )";
            $base .= ": Время звучания - {$this -> playLength}";
            return $base;
        }

    }

                    /* Класс BookProduct (дочерний) расширяет возможности класса ShopProduct */

    class BookProduct extends ShopProduct {
        public $numPages;

        function __construct ($title, $firstName, $mainName, $price, $numPages) {

            parent:: __construct ($title, $firstName, $mainName, $price); // все аргументы кроме $numPages обрабатывает родительский конструктор
            // каждый дочерний класс вызывает конструктор своего родительского класса, прежде чем определять собственные свойства
            $this -> numPages = $numPages;

        }

        function getNumberOfPages () {  // метод. вернуть количество страниц этого ($this) класса
            return $this -> numPages;
        }

        function getSummaryLine () {    // метод. возвращает название книги; имя, фамилию автора и количество страниц
            $base = "{$this -> title} ( {$this -> producerMainName}, ";
            $base .= "{$this -> producerFirstName} )";
            $base .= ": {$this -> numPages} стр.";
            return $base;
        }
    }

    $productBook = new BookProduct ("Игра престолов", "Мартин", "Джордж", "20 $", 500);
    echo $productBook->getSummaryLine();

    // => Игра престолов ( Джордж, Мартин ): 500 стр.