我們討論了關於IoC控制反轉的設計原則,現在我們用PHP來實現IoC設計原則,加深對這個概念的理解。
首先編寫 Fruit 的 POJO 和 Fruit 介面。繼承 Fruit 介面產生兩個類 Apple 和 Banana,這兩個類都實現了介面的 showColor() 方法。
Fruit.php
color; } function setColor($value){ $this->color=$value; } function showColor(){ echo "Apple Color:" . $this->color; }}class Banana implements Fruit { private $color; function getColor(){ return $this->color; } function setColor($value){ $this->color=$value; } function showColor(){ echo "Banana Color:" . $this->color; }}?>
ClassFactory.php
類工廠實現了一些簡易功能,能夠解析指定的設定檔,並根據設定檔產生類,同時設定指定的屬性值:
","",$content); //轉成數組 $this->arr_conf=json_decode($content,true); } function getBean($class_id){ //尋找匹配 $class_id 的類 while(true){ //挨個測試 $conf=each($this->arr_conf); //找不到,返回 null if($conf==false) return null; if(strcmp($class_id,$conf["value"]["id"])===0){ //如果匹配則裝入類檔案 include_once($conf["value"]["class_file"]); //產生類的執行個體 //print_r($conf["value"]["class_name"]); $obj=new $conf["value"]["class_name"](); //尋找被設定的屬性 $arr_prop=$conf["value"]["properties"]; while($prop=each($arr_prop)){ //產生屬性的設定方法 setXXX ,第一個字母大寫 $set_method="set". ucwords($prop["value"]["name"]); //調用設定方法,並設定預設值 $obj->$set_method($prop["value"]["value"]); } //找到第一個,返回執行個體 return $obj; } } }}?>
config.json
//備忘使用雙反斜杆[ { //類ID,方便工廠尋找 "id": "Apple", //類名 "class_name":"Apple", //類檔案 "class_file":"Fruit.php", //屬性設定 "properties":[ { "name":"color", "value":"Red" } ] }, { "id": "Banana", "class_name":"Banana", "class_file":"Fruit.php", "properties":[ { "name":"color", "value":"Yellow" } ] }]
test.php
為類工廠指定上述設定檔。我們可以看見,對設定檔裡的不同ID,返回了不同的類執行個體。調用每個執行個體的方法,分別輸出了Red和Yellow。可見,我們只需要改變更配置置檔案的內容,就可以返回不同的類執行個體,而不需修改程式原始碼。這就實現了簡單的 IOC 或者 DI。
getBean("Apple");echo $fruit->showColor() .'
';$fruit = $factory->getBean("Banana");echo $fruit->showColor() .'
';?>
PHP是動態語言,利用一些語言特性,實現起來很簡單,也沒用到反射之類的概念。
程式運行結果
Apple Color:RedBanana Color:Yellow
http://www.bkjia.com/PHPjc/752399.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/752399.htmlTechArticle我們討論了關於IoC控制反轉的設計原則,現在我們用PHP來實現IoC設計原則,加深對這個概念的理解。 首先編寫 Fruit 的 POJO 和 Fruit 介面。繼...