Heim >Backend-Entwicklung >PHP-Problem >So implementieren Sie die Umkehrung der Kontrolle in PHP

So implementieren Sie die Umkehrung der Kontrolle in PHP

(*-*)浩
(*-*)浩Original
2019-09-24 10:53:483153Durchsuche

IoC, Inversion of Control, Übertragung von Abhängigkeiten, Abhängigkeitsabstraktion statt Übung

DI, Dependency Injection, Sie müssen die Objekte nicht pflegen Abhängigkeiten im Code. Der Container fügt die Abhängigkeiten automatisch entsprechend der Konfiguration in das angegebene Objekt ein.

So implementieren Sie die Umkehrung der Kontrolle in PHP

In einem bestimmten Bereich gibt es verschiedene Geschäfte, und jedes Geschäft verkauft Vier Obstsorten: Äpfel für je zehn Yuan, Bananen für je 20 Yuan, Orangen für je 30 Yuan und Wassermelonen für je 40 Yuan. Kunden können sie in jedem Geschäft kaufen, und jedes Geschäft kann dem Finanzamt den Gesamtumsatz melden Jederzeit bei Bedarf. (Empfohlenes Lernen: PHP-Programmierung vom Einstieg bis zur Beherrschung)

Erste Codeimplementierung

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

Sie können sehen, dass der Code zwar vollständig ist, um ihn zu erfüllen Die aktuelle Implementierung muss implementiert werden, aber die Shell () -Methode basiert derzeit auf bestimmten Praktiken und hat die absolute Kontrolle. Sobald wir dem Store ein neues Produkt hinzufügen müssen, beispielsweise Mango, müssen wir die Methode „sell()“ der Store-Klasse ändern, was gegen das OCP-Prinzip verstößt, das für Erweiterungen offen und für Änderungen geschlossen ist.

An dieser Stelle können wir den Code wie folgt ändern

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

Der obige Code fügt eine abstrakte Klasse namens Fruit hinzu, und alle Früchte werden unabhängig von der Fruit-Klasse At geerbt Dieses Mal basiert die Methode „sell()“ nicht mehr auf dem spezifischen Fruchtnamen, sondern auf der abstrakten Fruchtklasse. Das Kontrollrecht zur Bestimmung der zu verkaufenden Menge ist nicht mehr in der Methode enthalten, sondern wird von außerhalb der Methode übergeben. Dies ist die Umkehrung der Kontrolle, und der Prozess zur Erreichung der Umkehrung der Kontrolle ist die Abhängigkeitsinjektion.

Durch Umkehrung der Kontrolle übergibt eine externe Entität, die alle Objekte im System steuert, bei der Erstellung eines Objekts die Referenz des Objekts, von dem es abhängt, an dieses. Man kann auch sagen, dass Abhängigkeiten in das Objekt eingefügt werden.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Umkehrung der Kontrolle in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn