IoC, 제어 역전, 종속성 이전, 실습보다는 추상화에 대한 종속성
DI , 종속성 주입(종속성 주입), 컨테이너는
#🎜🎜에 따라 지정된 객체에 종속성을 자동으로 주입합니다. ##🎜 🎜#특정 지역에는 다양한 상점이 있습니다. 각 상점에서는 4가지 종류의 과일을 판매합니다. 사과는 10위안, 바나나는 20위안, 오렌지는 30위안, 수박은 40위안입니다. 각 매장은 언제든지 세무국에 총 매출을 제공할 수 있어야 합니다. (추천 학습 :
초보부터 마스터까지 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 클래스에 의존하여 얼마를 판매할지 결정하는 권한은 더 이상 메소드에 포함되지 않습니다. 메소드 외부에 전달된
제어 역전을 통해 객체가 생성되면 시스템의 모든 객체를 제어하는 외부 엔터티가 자신이 의존하는 객체의 참조를 전달합니다. 의존성이 객체에 주입된다고도 말할 수 있습니다.
위 내용은 PHP에서 제어 반전을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!