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円