Storm-coder
4/7/2017 - 9:11 AM

Семейство классов ShopProduct

Семейство классов ShopProduct

<?php
    
    class ShopProduct {
        private $title;
        private $producerMainName;
        private $producerFirstName;
        protected $price;   // защищено потому, что вызывается в методе getPrice класса BookProduct
        private $discount = 0;

        public function __construct ($title, $firstName, $mainName, $price) { // свойство $discount не входит - оно "0" по умолчанию
            $this -> title                  = $title;
            $this -> producerFirstName      = $firstName;
            $this -> producerMainName       = $mainName;
            $this -> price                  = $price;
        }

        public function getProducerFirstName () { // method
            return $this -> producerFirstName;
        }

        public function getProducerMainName () { // method
            return $this -> producerMainName;
        }

        public function setDiscount ($num) { // method. устанавливает значение свойству discount в этом методе, а не в методе-конструкторе
            $this -> discount = $num;
        }

        public function getDiscount () {
            return $this -> discount;
        }

        public function getTitle () {
            return $this -> title;
        }

        public function getPrice () {
            return ($this -> price - $this -> discount);
        }

        public function getProducer () {
            return "{$this -> producerFirstName}"
                  ."{$this -> producerMainName}";
        }

        public function getSummaryLine () {
            $base = "{$this -> title} ( {$this -> producerMainName}, ";
            $base .= "{$this -> producerMainName} )";
            return $base;
        }

    }



    class CDproduct extends ShopProduct {
        private $playLength = 0; // свойство (значение по умолч. "0")

        /*
          В мотоде-конструкторе этого класса задается аргумент $playLength, потому, что свойство playLength обрабатывается этим методом-конструктором. Для сравнения: в классе ShopProduct аргумент $discount в конструкторе не указывается потому, что свойство discount обрабатывает метод setDiscount (принимает аргумент (значение) для свойства discount).
        */

        public function __construct ($title, $firstName, $mainName, $price, $playLength) {
            parent:: __construct ($title, $firstName, $mainName, $price);

            $this -> playLength = $playLength; // свойство класса CDproduct. указать значение для свойства playLength

            /* Все свойства, кроме $playLength, обрабатывает родительский метод-конструктор.
               В методе - конструкторе класса CDproduct сначала перечисляются все свойства, которые нужно обработать.
               Далее указывается, какие свойства должен обработать родительский конструктор.
            */
        }

        public function getPlayLength () {
            return $this -> playLength;
        }

        public function getSummaryLine () { 
            $base = parent:: getSummaryLine (); // этот метод класса CDproduct обрабатывает родительский метод
            $base .= ": Время звучания - {$this -> playLength}"; // ...и к родительскому методу добавляет "Время звучания"
            return $baze;
        }
    }



    class BookProduct extends ShopProduct {
        private $numPages = 0; // свойство класса

        public function __construct ($title, $firstName, $mainName, $price, $numPages) {
            parent:: __construct ($title, $firstName, $mainName, $price); // все свойства, кроме $numPages обрабатывает родительский конструктор

            $this -> numPages = $numPages; // присвоить значение свойству numPages
        }

        public function getNumberOfPages () {
            return $this -> numPages;
        }

        public function getSummaryLine () {
            $base = parent:: getSummaryLine ();
            $base .= "{$this -> numPages} стр.";
            return $base;
        }

        public function getPrice () {
            return $this -> price;
        }
    }

    // В классе ShopProduct свойство price защищено потому, что вызывается в методе getPrice класса BookProduct. Остальные свойства в классе ShopProduct - приватные, потому, что в дочерних классах обрабатываются родительским конструктором и в дочерних классах не вызываются. А те оставшиеся свойства, которые вызываются в дочерних классах - в них же и определяются.

    // Методы дочерних классов, в которых используются свойства родительского класса - вызываются из родительского класса (например: $base = parent:: getSummaryLine () ) и с помощью использования свойств, определенных в дочернем классе - эти методы расширяются и становятся МЕТОДОМ ДОЧЕРНЕГО КЛАССА.

    // Из дочернего класса можно обратится к методам родительского класса.
    // Из одного дочернего класса нельзя обратится к методам другого дочернего класса! Для этого нужно создать объект того класса, к методу которого обращаешься.

    $productCD = new CDproduct ("Битва королей", "Джордж", "Мартин", "5$", "120");
    echo $productCD -> getTitle ();

    // => Битва королей