>백엔드 개발 >PHP 문제 >PHP에서 제어 반전을 구현하는 방법

PHP에서 제어 반전을 구현하는 방법

(*-*)浩
(*-*)浩원래의
2019-09-24 10:53:483152검색

IoC, 제어 역전, 종속성 이전, 실습보다는 추상화에 대한 종속성

DI , 종속성 주입(종속성 주입), 컨테이너는

PHP에서 제어 반전을 구현하는 방법#🎜🎜에 따라 지정된 객체에 종속성을 자동으로 주입합니다. ##🎜 🎜#특정 지역에는 다양한 상점이 있습니다. 각 상점에서는 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 &#39;apple&#39;:<br/>                $this->turnover += 10;<br/>                echo "卖出一个苹果<br/>";<br/>                break;<br/>            case &#39;banana&#39;:<br/>                $this->turnover += 20;<br/>                echo "卖出一个香蕉<br/>";<br/>                break;<br/>            case &#39;orange&#39;:<br/>                $this->turnover += 30;<br/>                echo "卖出一个橘子<br/>";<br/>                break;<br/>            case &#39;watermelon&#39;:<br/>                $this->turnover += 40;<br/>                echo "卖出一个西瓜<br/>";<br/>                break;<br/>        }<br/>    }<br/>    // 显示商店目前的总销售额<br/>    public function getTurnover(){<br/>        echo $this->name.&#39;目前为止的销售额为:&#39;.$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(&#39;kfc&#39;);<br/>// new一个名为mike的顾客<br/>$mike = new Human();<br/><br/>// mike从kfc买了一个苹果<br/>$mike->buy($kfc,&#39;apple&#39;);<br/>// mike从kfc买了一个香蕉<br/>$mike->buy($kfc,&#39;banana&#39;);<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 &#39;卖出一个&#39;.$commodity->name.&#39;,收入&#39;.$commodity->price."元<br/>";<br/>    }<br/><br/>    //显示商店目前的总销售额<br/>    public function getTurnover(){<br/>        echo $this->name.&#39;目前为止的销售额为:&#39;.$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 = &#39;apple&#39;;<br/>    public $price = 10;<br/>}<br/>class Bananae extends Fruit<br/>{<br/>    public $name = &#39;banana&#39;;<br/>    public $price = 20;<br/>}<br/>class Orange extends Fruit<br/>{<br/>    public $name = &#39;orange&#39;;<br/>    public $price = 30;<br/>}<br/>class Watermelon extends Fruit<br/>{<br/>    public $name = &#39;watermelon&#39;;<br/>    public $price = 40;<br/>}<br/><br/>//new一个名为kfc的商店<br/>$kfc = new Shop(&#39;kfc&#39;);<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.