posts - 48,comments - 156,trackbacks - 0
一、编写 Hello 的 POJO,一个 Hello 接口,两个类实现这个接口的 sayHello() 方法。其中,中文版 CnHello 类,显示中文问候;英文 EnHello 类,显示英文问候。
自己看代码吧,很简单:

版权声明:本博客文章如非特别注明,均为原创,作者保留所有权利!欢迎转载,转载请注明作者左洸和出处http://www.blogjava.net/myqiao

Hello.php
<?php

/**
 * @author 左洸,http://www.blogjava.net/myqiao
 
*/
interface Hello {
    public function sayHello();
}

//中文版
class EnHello implements Hello{
    
private  $msg;

    
function getMsg(){
        
return $this->msg;
    }

    
function setMsg($value){
        
$this->msg=$value;
    }
    
    
function sayHello(){
        
echo "English Version:" . $this->msg;
    }
}

//英文版
class CnHello implements Hello{
    
private  $msg;

    
function getMsg(){
        
return $this->msg;
    }

    
function setMsg($value){
        
$this->msg=$value;
    }

    
function sayHello(){
        
echo "中文版" . $this->msg;
    }
}

?>


二、自己设计了一个配置文件,使用 JSON 格式,里面有注释,看看就明白了
//作者:左洸
//
http://www.blogjava.net/myqiao

//备注使用双反斜杆
[
    
//英文版配置
    {
        
//类ID,方便工厂查找
        "id""enHello",

        
//类名
        "class_name":"EnHello",

        
//类文件
        "class_file":"Hello.php",

        
//属性设置
        "properties":[
            
{
                
"name":"msg",
                
"value":"Hello World!"
            }

        ]
    }
,

    
//中文版配置
    {
        
"id""cnHello",
        
"class_name":"CnHello",
        
"class_file":"Hello.php",
        
"properties":[
            
{
                
"name":"msg",
                
"value":"世界你好!"
            }

        ]
    }

]

三、测试。为类工厂指定上述配置文件。我们可以看见,对配置文件里的不同ID,返回了不同的类实例。调用每个实例的方法,分别输出了中文问候和英文问候。可见,我们只需要改变配置文件的内容,就可以返回不同的类实例,而不需修改程序源代码。这就实现了简单的 IOC 或者 DI。
test.php
<?php
include_once("ClassFactory.php");
$factory = new ClassFactory("config.json");

$hello=$factory->getBean("enHello");
echo $hello->sayHello() .'<br>';

$hello=$factory->getBean("cnHello");
echo $hello->sayHello();
?>
输出:
English Version:Hello World!
中文版世界你好!

四、类工厂闪亮登场。实现了一些简单功能,能够解析指定的配置文件,并根据配置文件生成类,同时设置指定的属性值,注释很详细,我就不多解释了。代码如下:
ClassFactory.php
<?php

/**
 * Description of ClassFactory
 *
 * @author 左洸  http://www.blogjava.net/myqiao
 
*/

class ClassFactory {
    
private $arr_conf;

    
function ClassFactory($config_file){
        
//读取配置文件内容
        $handle = fopen($config_file, r);
        
$content = fread($handle, filesize($config_file));
        
fclose($handle);

        
//去除注释
        $content=preg_replace("<\/\/.*?\s>","",$content);

        
//转成数组
        $this->arr_conf=json_decode($content,true);
    }

     
function getBean($class_id){
        
//查找匹配 $class_id 的类
        while(true){
            
//挨个测试
            $conf=each($this->arr_conf);

            
//找不到,返回 null
            if($conf==falsereturn 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;
            }
        }
    }
}
?>

最后说一下,PHP是动态语言,利用一些语言特性,实现起来很简单,也没用到反射之类的概念。要是用 Java 实现可能要复杂点。

过两天有时间再试一下PHP 版 AOP 面向切面。

版权声明:本博客文章如非特别注明,均为原创,作者保留所有权利!欢迎转载,转载请注明作者左洸和出处http://www.blogjava.net/myqiao

posted on 2009-05-01 01:25 左洸 阅读(6074) 评论(23)  编辑  收藏 所属分类: PHP

FeedBack:
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-01 03:16 | m
为了用而实现,为了实现而实现。

你完成了后者。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-01 11:46 | 左洸
@一楼

你的回复不知道我能不能这样理解:
1、你认为Php不需要用Ioc,所以我的实现不是为了用而实现;
2、你的方法学中除了为了用而实现、为了实现而实现之外,似乎还少了一条:为了理解而实现。
3、如果以上两条都不是,我只能理解为一楼已经达到神仙级境界,需要的东西不需要有人先实现,自己念念咒语就能拿来用了。
4、最后明白一条道理:狐狸想吃葡萄,却够不着,那是因为葡萄是酸的。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-01 15:06 | m
从言语中得取益处的是仁智,俘获疵漏的便是千虑。
我只是想提醒你不要被技术蒙蔽,以至于本末倒置了。
你这样意气用事,对你又有何提高呢,又何必赌气回复。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-01 16:24 | 左洸
@m
m兄,恕我愚钝,你的意思到底是根本不需要 Ioc?还是 Php 不需要Ioc?再或者是根本不需要Php?
我花了几个小时写了这些代码当然是为了用,学习Ioc的思想也是为了应用中提高代码质量,控制变化。这个实现虽然有些粗糙,但是简洁实用。正是实用的风格啊!所以你的两次回复我还是没搞明白你要说什么。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-01 22:46 | wing5jface
学而致用,多做准备不是错的,模式是前人经验的集合。支持探索。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-02 19:58 | sharenet
同意一楼,我甚至认为PHP不需要框架!  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-05-02 19:59 | sharenet
@m
同意一楼,我甚至认为PHP不需要框架!   回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-06-05 14:01 | ycmhn
不是打击LZ我确实同意一楼那位
php本身运行机理和java不同,不能和java一样在搞那么多框框架架之后还能顶得住,php的类开销是不能承受之重,因为它不像java一样有app server
在保持良好结构的前提下尽量少用类,所以我认为这些复杂的东西在php里有点故弄玄虚的感觉
php用好函数和数组,就基本能解决全部问题  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-06-05 14:03 | ycmhn
php是简单的,类多一点后可能最后会慢的像爬的~  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2009-07-15 03:40 | ke
@ycmhn

说得太夸张了!  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-08-03 10:41 | chuck911
为什么php被认为不适合做企业级应用?那不是php语言有缺陷,而是因为php太易上手,很容易就能做简单应用,于是入门者就以为自己了解了这门语言,不做深究,导致php程序员平均素质较低(至少国内是这情况)。
我不知道为什么这么多低级php程序员一齐出现在这里了...
不用框架?就算你不懂OOP,你也需要代码重用,做些library吧
国外平均水平以上的php程序员都有自己的框架或者改造了流行的框架
有些人就是没有生活乐趣,总在做简单重复无味的工作,那你就去用naive php吧
博主是个上进的人~  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-08-27 14:27 | acheng7777
博主的精神是值得赞扬的,这事毫无疑问的。我们总说我们比其他动物更加高级,是因为我们拥有了一项很重要的技能--思考。技术之所以进步是因为不断有人在探索、完善;并不是你今天拿来用,明天再拿来用,这样周而复始不加思考与总结就能发展的。那些不认同博主的朋友们,你们可曾问过自己这个问题:在某项技术的发展过程中,你是想充当参与其中的探索研究者,还是仅仅麻木的充当一个使用者?孰是孰非其实是个很简单的问题,我们何必装作看不看呢!  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2009-09-22 17:44 | qq
good
lz的东东很有意思,正想找这方面的资料
那些攻击lz的都是些it民工,他们哪里明白程序的真滴, 不必理会  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-11-17 06:27 | Programmer Huang
IOC和DI都是很有用的东西, 不管是什么语言中的. 这是一个设计.
当然很多简单的项目, 不需要这么复杂的设计.
怎么设计, 怎么用, 都要讲究个度. 作者的探索精神是很好的, 支持你.
而我主要想说的是, 作者的理解应该没有错误, 但实现错误了.
这个设计仅仅是个工厂模式, 是实现了IOC, 但没有实现DI.
DI应该是让你把En和Cn两个类, 以参数的方式传递给要使用Hello接口的类.
这里有我在PPC上的讨论:
http://bbs.phpchina.com/thread-164113-1-1.html
7楼有我对你的设计的看法.   回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2010-08-18 13:57 | kk
@Programmer Huang
“这个设计仅仅是个工厂模式, 是实现了IOC, 但没有实现DI. “ 我觉得这个说的不是特别对。首先工厂方法和DI是两个层面的东西,工厂方法可以实现DI,但是DI不局限在工厂方法的实现。lz这个实现已经满足了DI了,依赖由外部影响,不在程序内部,简单来看就是配置文件代替了代码的更改  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2012-04-20 14:02 | frank
@ycmhn
你的话自己在家里说说就可以,不要误导新人,时下的php已经发展成一个完全面向对象的语言,zend以及众多开发者为实现php内核部分的面向对象的付出你敢说是无用功?   回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2012-04-20 14:03 | frank
@ycmhn
无知不要卖弄。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2012-04-20 14:06 | frank
不是打击LZ我确实同意一楼那位
php本身运行机理和java不同,不能和java一样在搞那么多框框架架之后还能顶得住,php的类开销是不能承受之重,因为它不像java一样有app server
在保持良好结构的前提下尽量少用类,所以我认为这些复杂的东西在php里有点故弄玄虚的感觉
php用好函数和数组,就基本能解决全部问题 回复 更多评论

# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2009-06-05 14:03 | ycmhn
php是简单的,类多一点后可能最后会慢的像爬的~ 回复 更多评论

ycmhn 看来真的很无知,php里没有app server? 类多一点后可能最后会慢的像爬的? 你测试过,

  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2013-03-29 08:23 |
博主2009年就知道Ioc了, 学习一下。

不过这个设计没有考虑singleton ,顺便鄙视瞧不起php的各位。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2013-04-26 04:04 | 一无所得
简单的同博主探讨一下:我的理解是,依赖注入应该是对依赖的解耦。
你的Factory也好,json配置也好,目的应该是帮助factory中的helloworld中耦合的对象解绑的,这个才是Ioc的直接目的。Facotry和您的json都是为了这个目的而加上去的设施,对吗?
目测helloworld中没有耦合的对象,自然谈不上Ioc。不知博主是否这样认为的?
现在时间距楼主发帖已经过去好几年了,相信楼主早就明白这些事情了。不过,为了后来人起见,我把网上另外一篇文章的地址贴在这里
http://blog.sina.com.cn/s/blog_7141dace0100lopb.html
应该很好的说明了为什么要用Ioc。  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2013-09-11 10:44 | zongtong
你用过框架没。@ycmhn
  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件
2013-09-11 10:48 | zongtong
个人觉得这些东西,在比较大的团队项目协作里面,作用提现的比较大.如果一个项目就只有一两个人来自做,完全没必要搞那些。

如果你的项目设计目的就是为了适应很多用户(开发者),比如你就想做一个开发框架之类的(当然开发框架的存在意义不是这个讨论的主题),这些IOC等等的设计模式就显得蛮重要的了。
@frank
  回复  更多评论
  
# re: 用PHP实现简单的控制反转(IOC) 依赖注入(DI),用JSON配置文件[未登录]
2016-04-08 10:25 | a
2016年了,這篇博客也有个年头了,看到一楼以及一楼的支持者,Lavarel和composer打脸不?一群无头苍蝇装大蒜,该死!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: