継承クラスでオーバーライドすると、そちらが優先されるだけで、親クラスのメソッドは存在している。
<?php
/****************************
クラスの定義
****************************/
class Product{
// プロパティの定義(価格を変数に)
protected $price;
// プロパティの定義(値引率を固定で)
protected $discountRate = 0.03;
// メソッドの定義(値引率を適用した価格を取得)
public function getPrice(){
$price = $this->price - ($this->price * $this->discountRate);
return $price;
}
// メソッドの定義(価格の設定)
public function setPrice($price){
$this->price = $price;
}
}
/*******************************
継承クラスの定義
*******************************/
class FoodProduct extends Product{
// プロパティの定義(賞味期限を固定で)
private $expire = 15;
// メソッドの定義(賞味期限を取得)
public function getExpire(){
return $this->expire; // 15を返す
}
// メソッドの定義(賞味期限を1ずつ減らし再取得)
public function decrementExpire(){
$this->expire--;
return $this->getExpire(); // 15から1引いた値を返す
}
// メソッドの定義(親クラスの$priceを上書きして再取得)
public function getPrice(){
$price = parent::getPrice();
if($this->expire <= 10){
$price = $price / 2;
}
return $price;
}
}
/**********************************
インスタンスの生成
**********************************/
$prd = new FoodProduct();
/*********************************
オブジェクトの操作
**********************************/
$prd->setPrice(100); // 価格の設定
$expire = $prd->getExpire(); // 賞味期限の取得(15日)
while($expire > 0){
$expire = $prd->decrementExpire();
echo "賞味期限:".$expire."日 価格:".$prd->getPrice()."円
";
}
?>
賞味期限:14日 価格:97円