IoC、制御の反転、依存関係の転送、実践ではなく抽象化への依存
DI、依存関係の注入、を維持する必要はありません。オブジェクトの依存関係をコードに記述します。コンテナは、設定に従って、指定されたオブジェクトに依存関係を自動的に挿入します。
特定のエリアにはさまざまなストアがあり、それぞれ店舗では、リンゴ 10 元、バナナ 20 元、オレンジ 30 元、スイカ 40 元の 4 種類の果物を販売しており、顧客はどの店舗でも購入することができ、各店舗の売上の合計を国民に提供することができます。必要に応じていつでも税務署に相談できます。 (推奨学習: PHP プログラミングの入門から習熟まで )
初期コード実装
class Shop<br/>{<br/> // 商店的名字<br/> private $name;<br/><br/> // 商店的总销售额<br/> private $turnover = 0;<br/><br/> public function __construct($name){<br/> $this->name = $name;<br/> }<br/><br/> // 售卖商品<br/> public function sell($commodity){<br/> switch ($commodity){<br/> case 'apple':<br/> $this->turnover += 10;<br/> echo "卖出一个苹果<br/>";<br/> break;<br/> case 'banana':<br/> $this->turnover += 20;<br/> echo "卖出一个香蕉<br/>";<br/> break;<br/> case 'orange':<br/> $this->turnover += 30;<br/> echo "卖出一个橘子<br/>";<br/> break;<br/> case 'watermelon':<br/> $this->turnover += 40;<br/> echo "卖出一个西瓜<br/>";<br/> break;<br/> }<br/> }<br/> // 显示商店目前的总销售额<br/> public function getTurnover(){<br/> echo $this->name.'目前为止的销售额为:'.$this->turnover;<br/> }<br/>}<br/><br/>// 顾客类<br/>class Human<br/>{<br/> //从商店购买商品<br/> public function buy(Shop $shop,$commodity){<br/> $shop->sell($commodity);<br/> }<br/>}<br/><br/>// new一个名为kfc的商店<br/>$kfc = new Shop('kfc');<br/>// new一个名为mike的顾客<br/>$mike = new Human();<br/><br/>// mike从kfc买了一个苹果<br/>$mike->buy($kfc,'apple');<br/>// mike从kfc买了一个香蕉<br/>$mike->buy($kfc,'banana');<br/><br/>// 输出kfc的总营业额<br/>echo $kfc->getTurnover();<br/>
コードは完成しましたが、次のことがわかります。現在の実装ニーズを満たしていますが、現時点では、shell() メソッドは特定のプラクティスに依存しており、絶対的な制御を持っています。マンゴーなどの新しい商品をストアに追加する必要がある場合は、ストア クラスの sell() メソッドを変更する必要がありますが、これは拡張にはオープンで変更にはクローズである OCP 原則に違反します。
この時点で、次のようにコードを変更できます
abstract class Fruit<br/>{<br/> public $name;<br/> public $price;<br/>}<br/>class Shop<br/>{<br/> //商店的名字<br/> private $name;<br/><br/> //商店的总销售额<br/> private $turnover = 0;<br/><br/> public function __construct($name){<br/> $this->name = $name;<br/> }<br/><br/> //售卖商品<br/> public function sell(Fruit $commodity){<br/> $this->turnover += $commodity->price;<br/> echo '卖出一个'.$commodity->name.',收入'.$commodity->price."元<br/>";<br/> }<br/><br/> //显示商店目前的总销售额<br/> public function getTurnover(){<br/> echo $this->name.'目前为止的销售额为:'.$this->turnover;<br/> }<br/>}<br/><br/>//顾客类<br/>class Human<br/>{<br/> //从商店购买商品<br/> public function buy(Shop $shop,$commodity){<br/> $shop->sell($commodity);<br/> }<br/>}<br/><br/>class Apple extends Fruit<br/>{<br/> public $name = 'apple';<br/> public $price = 10;<br/>}<br/>class Bananae extends Fruit<br/>{<br/> public $name = 'banana';<br/> public $price = 20;<br/>}<br/>class Orange extends Fruit<br/>{<br/> public $name = 'orange';<br/> public $price = 30;<br/>}<br/>class Watermelon extends Fruit<br/>{<br/> public $name = 'watermelon';<br/> public $price = 40;<br/>}<br/><br/>//new一个名为kfc的商店<br/>$kfc = new Shop('kfc');<br/>//new一个名为mike的顾客<br/>$mike = new Human();<br/><br/>//mike从kfc买了一个苹果<br/>$mike->buy($kfc,new Apple());<br/>//mike从kfc买了一个香蕉<br/>$mike->buy($kfc,new Bananae());<br/><br/>//输出kfc的总营业额<br/>echo $kfc->getTurnover();<br/>
上記のコードは、Fruit という名前の抽象クラスを追加し、すべてのフルーツは独立して Fruit クラスから継承されます。今回、sell() メソッドは特定のフルーツ名ではなく、抽象 Fruit クラスに依存するようになり、いくらで売るかを決定する制御権はメソッドには含まれなくなり、メソッドの外部から渡されます。 これは制御の反転であり、制御の反転を達成するプロセスは依存性注入です。
制御の反転により、オブジェクトが作成されると、システム内のすべてのオブジェクトを制御する外部エンティティが、依存するオブジェクトの参照をそれに渡します。依存関係がオブジェクトに注入されるとも言えます。
以上がPHPで制御の反転を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。