Maison >développement back-end >Problème PHP >Comment implémenter l'inversion de contrôle en php

Comment implémenter l'inversion de contrôle en php

(*-*)浩
(*-*)浩original
2019-09-24 10:53:483151parcourir

IoC, Inversion of Control, transfert de dépendances, abstraction des dépendances plutôt que pratique

DI, Dependency Injection, vous n'avez pas à maintenir l'objet dépendances dans le code. Le conteneur injecte automatiquement les dépendances dans l'objet spécifié en fonction de la configuration

Comment implémenter l'inversion de contrôle en php

Il existe différents magasins dans une certaine zone, et chaque magasin a des magasins. vendent quatre sortes de fruits : des pommes pour dix yuans pièce, des bananes pour vingt yuans pièce, des oranges pour trente yuans pièce et des pastèques pour quarante yuans pièce. Les clients peuvent les acheter dans n'importe quel magasin, et chaque magasin peut fournir le total de ses ventes au bureau des impôts. à tout moment si nécessaire. (Apprentissage recommandé : Programmation PHP de l'entrée à la maîtrise)

Implémentation initiale du code

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/>

Vous pouvez voir que même si le code est terminé pour répondre l'actuel doit être implémenté, mais la méthode shell() s'appuie actuellement sur des pratiques spécifiques et a un contrôle absolu. Une fois que nous devons ajouter un nouveau produit au magasin, comme la mangue, nous devons modifier la méthode sell() de la classe store, ce qui viole le principe OCP, qui est ouvert aux extensions et fermé aux modifications.

À ce stade, nous pouvons modifier le code comme suit

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/>

Le code ci-dessus ajoute une classe abstraite nommée Fruit, et tous les fruits sont hérités indépendamment de la classe Fruit At. cette fois, la méthode sell() ne s'appuie plus sur le nom spécifique du fruit, mais sur la classe abstraite Fruit. Le droit de contrôle pour déterminer la quantité à vendre n'est plus inclus dans la méthode, mais est transmis de l'extérieur de la méthode. Il s'agit d'une inversion de contrôle, et le processus permettant d'obtenir une inversion de contrôle est une injection de dépendance.

Par inversion de contrôle, lorsqu'un objet est créé, une entité externe qui contrôle tous les objets du système lui transmet la référence de l'objet dont il dépend. On peut aussi dire que des dépendances sont injectées dans l'objet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn