interface -インターフェイス-

1,インターフェイスとは抽象メソッドのみ(内容は記述しない)定義でき、抽象クラスと同じようにインスタンスは生成できない。
インスタンスができないということは、"抽象クラス"と同じく"継承"されるのだが
"インターフェイス"の場合は継承と呼ばずに"実装"と呼ぶ


2,また、接頭詞は"class"ではなく"interface"をもって定義する。
3,アクセス修飾子は"public"のみ。
4,インターフェイスブロックで定義したメソッドや引数の数、名前は実装先に同じ数、同じ名前が揃ってなければならない。

インターフェイスの定義

<?php
//インターフェイス
interface iProduct{
	public function applyPriceDown();
	public function getPrice();
	public function setPrice($price);
	}
//実装先クラス
class Besitable implements iProduct{//野菜クラス:全品3割引
	private $price = 1000;
	
	public function applyPriceDown(){
		$this->price = $this->price * 0.7;
		}
	public function getPrice(){
		return $this->price;
		}
	public function setPrice($price){
		$price = $this->price;
		}
	}

class Meet implements iProduct{//肉クラス:特定日半額
	private $price = 1000;
	
	public function applyPriceDown(){
		if('29' == date('d')){
			$this->price = $this->price / 2;
			}
		}
	public function getPrice(){
		return $this->price;	
		}
	public function setPrice($price){
		$price = $this->price;
		}
	}

class FreezedFood implements iProduct{//冷凍食品クラス:値引き対象外
	private $price = 1000;
	
	public function applyPriceDown(){
		//値引き対象外
		}
	public function getPrice(){
		return $this->price;	
		}
	public function setPrice($price){
		$price = $this->price;
		}
	}

//カート
class Cart{
	private $products = array();
	
	public function addProduct($product){
		$product->applyPriceDown();
		$this->products[] = $product;
		}
	
	public function getTotalPrice(){
		$total = 0;
		foreach($this->products as $product){
			$total += $product->getPrice();
			}
		return $total;
		}
	}

$cart = new Cart();

//商品
$meet = new Meet();
$besitable = new Besitable();
$freezed = new FreezedFood();

//カートに商品追加
$cart->addProduct($meet);
$cart->addProduct($besitable);
$cart->addProduct($freezed);

//現在の合計金額
$total = $cart->getTotalPrice();
var_dump($total);
?>



出力結果

日にちが29日の場合:700(肉:1000x3割引)+500(野菜:1000x半額)+1000(冷凍:割引無し) = 2200円
日にちが29日以外の場合:700(肉:1000x3割引)+1000(野菜:割引無し)+1000(冷凍:割引無し) = 2700円