PHP实现控制反转

Fruit.php

 

  1. <?php    
  2.         
  3. /**  
  4.  * @author Gonn, http://www.nowamagic.net/  
  5.  */    
  6. interface Fruit {    
  7.     public function showColor();    
  8. }  
  9.  
  10. Apple.php  
  11. class Apple implements Fruit {    
  12.     private $color;    
  13.     function getColor(){    
  14.         return $this->color;    
  15.     }    
  16.     function setColor($value){    
  17.         $this->color=$value;    
  18.     }    
  19.         
  20.     function showColor(){    
  21.         echo "Apple Color:" . $this->color;    
  22.     }    
  23. }    
  24.  
  25. Banana.php
  26. class Banana implements Fruit {    
  27.     private  $color;    
  28.     function getColor(){    
  29.         return $this->color;    
  30.     }    
  31.     function setColor($value){    
  32.         $this->color=$value;    
  33.     }    
  34.     function showColor(){    
  35.         echo "Banana Color:" . $this->color;    
  36.     }    
  37. }    
  38. ?>  

 

 

 

ClassFactory.php

  1. <?php    
  2.         
  3. /**  
  4.  * @author Gonn, http://www.nowamagic.net/  
  5.  */    
  6. class ClassFactory {    
  7.     private $arr_conf;    
  8.     function ClassFactory($config_file){    
  9.         //读取配置文件内容    
  10.         $handle = fopen($config_file, r);    
  11.         $content = fread($handle, filesize($config_file));    
  12.         fclose($handle);    
  13.         //去除注释    
  14.         $content=preg_replace("<\/\/.*?\s>","",$content);    
  15.         //转成数组    
  16.         $this->arr_conf=json_decode($content,true);    
  17.     }    
  18.      function getBean($class_id){    
  19.         //查找匹配 $class_id 的类    
  20.         while(true){    
  21.             //挨个测试    
  22.             $conf=each($this->arr_conf);    
  23.             //找不到,返回 null    
  24.             if($conf==false) return null;    
  25.             if(strcmp($class_id,$conf["value"]["id"])===0){    
  26.                 //如果匹配则装入类文件    
  27.                 include_once($conf["value"]["class_file"]);    
  28.                 //生成类的实例    
  29.                 //print_r($conf["value"]["class_name"]);    
  30.                 $obj=new $conf["value"]["class_name"]();    
  31.                 //查找被设置的属性    
  32.                 $arr_prop=$conf["value"]["properties"];    
  33.                 while($prop=each($arr_prop)){    
  34.                     //生成属性的设置方法 setXXX ,第一个字母大写    
  35.                     $set_method="set". ucwords($prop["value"]["name"]);    
  36.                     //调用设置方法,并设置预设值    
  37.                     $obj->$set_method($prop["value"]["value"]);    
  38.                 }    
  39.                 //找到第一个,返回实例    
  40.                 return $obj;    
  41.             }    
  42.         }    
  43.     }    
  44. }    
  45. ?>   

 

 

Config.json

 

 

  1. //备注使用双反斜杆    
  2. [    
  3.     {    
  4.         //类ID,方便工厂查找    
  5.         "id": "Apple",    
  6.         //类名    
  7.         "class_name":"Apple",    
  8.         //类文件    
  9.         "class_file":"Fruit.php",    
  10.         //属性设置    
  11.         "properties":[    
  12.             {    
  13.                 "name":"color",    
  14.                 "value":"Red"    
  15.             }    
  16.         ]    
  17.     },    
  18.     {    
  19.         "id": "Banana",    
  20.         "class_name":"Banana",    
  21.         "class_file":"Fruit.php",    
  22.         "properties":[    
  23.             {    
  24.                 "name":"color",    
  25.                 "value":"Yellow"    
  26.             }    
  27.         ]    
  28.     }    
  29. ]   

 

测试文件:test.php

 

  1. <?php    
  2. include_once("ClassFactory.php");    
  3. $factory = new ClassFactory("config.json");    
  4. $fruit = $factory->getBean("Apple");    
  5. echo $fruit->showColor() .'<br />';    
  6. $fruit = $factory->getBean("Banana");    
  7. echo $fruit->showColor() .'<br />';    
  8. ?>   

 

 

 

运行结果:

 

  1. Apple Color:Red  
  2. Banana Color:Yellow 

 

 


转自:http://blog.csdn.net/xiongping_/article/details/44077991

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值