首先编写 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 类工厂实现了一些简单功能,能够解析指定的配置文件,并根据配置文件生成类,同时设置指定的属性值:
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 接口。继...
