Storm-coder
3/29/2017 - 5:17 PM

Добавить в тело метода собственный код для проверки типа объекта.

Добавить в тело метода собственный код для проверки типа объекта.

<?php

            /*Класс CDProduct*/

    class CDProduct {

        public $playLength; // свойство класса
        public $title;
        public $producerMainName;
        public $producerFirstName;
        public $price;

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

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

        }

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

        function getSummaryLine () { // метод. возвращает одной строкой: A state of trance ( Armin, Van Burren ): Время звучания - 180 min
            $base = "{$this -> title} ( {$this -> producerFirstName}, ";
            $base .= "{$this -> producerMainName} )";
            $base .= ": Время звучания - {$this -> playLength}";
            return $base;
        }

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

        /*Класс BookProduct*/

    class BookProduct {

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

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

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

        }

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

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

        function getProducer () { // метод. возвр. имя и фам автора
            return "{$this -> producerFirstName} " .    // пишем return в самом начале метода потому, что нет переменной (как в методе getSummaryLine)
                    "{$this -> producerMainName}";
        }
    }





            /*Создать класс ShopProductWriter (Добавить в тело метода собственный код для проверки типа объекта)*/

    class ShopProductWriter {

    public function write ($shopProduct) { // метод класса (ему передается обьект $product1 (уточнение, предназначен для работы  с одним типом: ShopProduct) )
        if (! ($shopProduct instanceof CDProduct) && ! ($shopProduct instanceof BookProduct) ) { // если переданный аргумент не относится к типу CDProduct и к типу BookProduct
            die("Передан неверный тип данных");
        }
        $str = "{$shopProduct->title}: " // изменить значение свойства title аргумента прилетевшего в переменную $ShopProduct
        . $shopProduct -> getProducer()
        ." ({$shopProduct->price})\n ";
        print $str;
        }

    }



/*=====================================================================   Создать объекты   ==================================================================*/


                                /*Создать новый объект типа CDProduct (по типу класса CDProduct)*/

    $productCD = new CDProduct("A state of trance", "Armin", "Van  Burren", "20 $", "180 min"); // создание нового объекта (типа CDProduct) и вызов конструктора
    echo $productCD -> getSummaryLine(); // обращаемся к методу getSummaryLine. возвращает одной строкой: A state of trance ( Armin, Van Burren ): Время звучания - 180 min
        // => A state of trance ( Armin, Van Burren ): Время звучания - 180 min




                                /*Создать новый объект типа BookProduct (по типу класса BookProduct)*/

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


                                /*Создать новый объект типа ShopProductWriter (по типу класса ShopProductWriter)*/

    $writer = new ShopProductWriter();  // $writer - обьект типа ShopProductWriter
    $writer -> write( $productCD ); // вызвать метод write и передать ему обьект $productCD типа ShopProductWriter


    // => A state of trance ( Armin, Van Burren ): Время звучания - 180 minИгра престолов ( Мартин, Джордж ): 500 страниц стр.A state of trance: Armin Van Burren (20 $)