Не работает наследование. Где ошибка?

209
01 апреля 2017, 01:44

Пример по книге: "Мы можем передать объект BookProduct или CDProduct методу write ( ) класса ShopProductWriter, и все будет работать как надо."

<?php
class ShopProduct {
    public $numPages;  // свойство.
    public $playLength;
    public $title;
    public $producerMainName;
    public $producerFirstName;
    public $price;
    function __construct ($title, $firstName, $mainName, $price, $numPages = 0, $playLength = 0) { // конструктор
        $this -> title              = $title; // через $this обращаюсь к свойству этого класса title и присваиваю ему значение (аргумент), которое прилетит в переменную $title, когда вызовется метод конструктора (вызывается при создании нового объекта)
        $this -> producerFirstName  = $firstName;
        $this -> producerMainName   = $mainName;
        $this -> numPages           = $numPages;
        $this -> playLength         = $playLength;
        $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 {
    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 {
    function getSummaryLine () {    // метод. возвращает название книги; имя, фамилию автора и количество страниц
        $base = "{$this -> title} ( {$this -> producerMainName}, ";
        $base .= "{$this -> producerFirstName} )";
        $base .= ": {$this -> numPages} стр.";
        return $base;
    }
}

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

$product2 = new CDProduct ("Wishmaster", "Группа", "Nightwish", "50 $", null, "70 min");
$product2 -> write($product2);
Answer 1

Вы обращаетесь не к тому классу, метод write доступен только в классе ShopProductWriter, а вы вызываете его с класса CDProduct, вот так должно отработать:

$writer = new ShopProductWriter();
$product2 = new CDProduct ("Wishmaster", "Группа", "Nightwish", "50 $", null, "70 min");
$writer->write($product2);
READ ALSO
Php достать уникальное число из массива

Php достать уникальное число из массива

Привет!Необходимо с помощью регулярки вытащить единственное уникальное число с массива)

208
Помогите просуммировать по критерию. mysql php с выводом в html

Помогите просуммировать по критерию. mysql php с выводом в html

Помогите просуммировать Очки команд

208
Преобразовать текст на php или js

Преобразовать текст на php или js

Есть номер телефона, который висит на сайтеЗадается он через панель управления

224
Как задать логическое и в регулярном выражении?

Как задать логическое и в регулярном выражении?

Собственно вот регулярное выражение которое у меня получилось:

233