1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
/* ----------------------------------------------------------------------------------
 *  クラス・オブジェクト:インターフェイス多重実装のカート機能処理の例
 *  2015.10.15 作成 yoshi of CXMedia Inc.
 * ----------------------------------------------------------------------------------
 */
/* --------------------------------------------------------------------------
 * 【インターフェイス】
 * 定義できるのは抽象メソッドのみ (抽象クラスは普通のメソッド定義可能)
 * 抽象メソッドだが「abstract」はいらない
 * アクセス修飾子には「public」しか指定できない→引数の数も名前も完全に一致
 * 直接インスタンスの生成はできない→「実装」:「implements」キーワード使用
 * -------------------------------------------------------------------------- */
/* -------------------
 *   クラスの構成
 * ------------------- */
// 商品インターフェイス
interface IProduct{
    public function 
applyPriceDown();
    public function 
getPrice();
    public function 
setPrice($price);
    public function 
getProduct();
}
// 食品インターフェイス
interface IFood{
    
//賞味期限を設定
    
public function setExpire();
    
//賞味期限チェック
    
public function checkExpire();
}


// 野菜クラス
class Vegetable implements IProduct{
    private 
$price   500;
    private 
$product 'キャベツ';
    public function 
applyPriceDown(){
        
// 常に3割引
        
$this->price $this->price 0.7;
    }
    public function 
getPrice(){
        return 
$this->price;
    }
    public function 
setPrice($data){
        
$this->price $data;
    }
    public function 
getProduct(){
        return 
$this->product;
    }
}

// 肉クラス
class Meet implements IProduct{
    private 
$price   2000;
    private 
$product '松坂牛パック';
    public function 
applyPriceDown(){
        if (
'29' == date('d')){ // 29日なら半額
            
$this->price $this->price 2;
        }
    }
    public function 
getPrice(){
        return 
$this->price;
    }
    public function 
setPrice($data){
        
$this->price $data;
    }
    public function 
getProduct(){
        return 
$this->product;
    }
}

// 冷凍食品クラス
class FreezedFood implements IProduct{
    private 
$price   500;
    private 
$product '餃子';
    public function 
applyPriceDown(){
        
// 値引きなし
    
}
    public function 
getPrice(){
        return 
$this->price;
    }
    public function 
setPrice($data){
        
$this->price $data;
    }
    public function 
getProduct(){
        return 
$this->product;
    }
}

// 食料品クラス:多重実装、カンマ区切りで複数のインターフェイスを指定
// 商品インターフェイス、食品インターフェイスのメソッド定義を全て記述が必要
class FoodProduct implements IProduct,IFood{
    
// プロパティ
    
private $price   2000;
    private 
$product 'マグロ刺身';
    
// メソッド:値引き
    
public function applyPriceDown(){
        
// 値引きなし
    
}
    
// メソッド:価格取得
    
public function getPrice(){
        return 
$this->price;
    }
    
// メソッド:価格セット
    
public function setPrice($price){
        
$this->price $price;
    }
    
// メソッド:商品取得
    
public function getProduct(){
        return 
$this->product;
    }
    
// メソッド:賞味期限を設定
    
public function setExpire(){
        
// 処理の省略
    
}
    
// メソッド:賞味期限チェック
    
public function checkExpire(){
        
// 処理の省略
    
}
}

// カートクラス
class Cart{
    
// 商品インスタンス保持用配列
    
private $products = array();

    
// 商品追加:タイプヒンティング引数にIProductを実装
    
public function addProduct(IProduct $product){
        
$product->applyPriceDown();
        
$this->products[] = $product;
    }
    
// 商品の合計価格取得
    
public function getTotalPrice(){
        
$total 0;
        foreach (
$this->products as $product) {
            
$total += $product->getPrice();
        }
        return 
$total;
    }
    
// 商品一覧を取得
    
public function getProductList(){
        
$productAry = array();
        foreach (
$this->products as $product) {
            
$productAry[] = array($product->getProduct(),$product->getPrice());
        }
        return 
$productAry;
    }
}

/* --------------
 *  クラスの利用
 * -------------- */
// ---インスタンス(オブジェクト)を作成--- //
// カート
$cart      = new Cart();
// 商品
$vegetable = new Vegetable();
$meet      = new Meet();
$freezed   = new FreezedFood();

// カートに商品オブジェクトを追加
$cart->addProduct($vegetable);
$cart->addProduct($meet);
$cart->addProduct($freezed);

// 現在の合計価格を取得
$total $cart->getTotalPrice();

// 現在のカート商品を取得
$ary   $cart->getProductList();

var_dump($total);
var_dump($ary);
?>