Семейство классов 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 ();
// => Битва королей