<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 48,comments - 156,trackbacks - 0
    一、編寫(xiě) Hello 的 POJO,一個(gè) Hello 接口,兩個(gè)類實(shí)現(xiàn)這個(gè)接口的 sayHello() 方法。其中,中文版 CnHello 類,顯示中文問(wèn)候;英文 EnHello 類,顯示英文問(wèn)候。
    自己看代碼吧,很簡(jiǎn)單:

    版權(quán)聲明:本博客文章如非特別注明,均為原創(chuàng),作者保留所有權(quán)利!歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者左洸和出處http://www.blogjava.net/myqiao

    Hello.php
    <?php

    /**
     * @author 左洸,http://www.tkk7.com/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;
        }
    }

    ?>


    二、自己設(shè)計(jì)了一個(gè)配置文件,使用 JSON 格式,里面有注釋,看看就明白了
    //作者:左洸
    //
    http://www.tkk7.com/myqiao

    //備注使用雙反斜桿
    [
        
    //英文版配置
        {
            
    //類ID,方便工廠查找
            "id""enHello",

            
    //類名
            "class_name":"EnHello",

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

            
    //屬性設(shè)置
            "properties":[
                
    {
                    
    "name":"msg",
                    
    "value":"Hello World!"
                }

            ]
        }
    ,

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

            ]
        }

    ]

    三、測(cè)試。為類工廠指定上述配置文件。我們可以看見(jiàn),對(duì)配置文件里的不同ID,返回了不同的類實(shí)例。調(diào)用每個(gè)實(shí)例的方法,分別輸出了中文問(wèn)候和英文問(wèn)候。可見(jiàn),我們只需要改變配置文件的內(nèi)容,就可以返回不同的類實(shí)例,而不需修改程序源代碼。這就實(shí)現(xiàn)了簡(jiǎn)單的 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!
    中文版世界你好!

    四、類工廠閃亮登場(chǎng)。實(shí)現(xiàn)了一些簡(jiǎn)單功能,能夠解析指定的配置文件,并根據(jù)配置文件生成類,同時(shí)設(shè)置指定的屬性值,注釋很詳細(xì),我就不多解釋了。代碼如下:
    ClassFactory.php
    <?php

    /**
     * Description of ClassFactory
     *
     * @author 左洸  http://www.tkk7.com/myqiao
     
    */

    class ClassFactory {
        
    private $arr_conf;

        
    function ClassFactory($config_file){
            
    //讀取配置文件內(nèi)容
            $handle = fopen($config_file, r);
            
    $content = fread($handle, filesize($config_file));
            
    fclose($handle);

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

            
    //轉(zhuǎn)成數(shù)組
            $this->arr_conf=json_decode($content,true);
        }

         
    function getBean($class_id){
            
    //查找匹配 $class_id 的類
            while(true){
                
    //挨個(gè)測(cè)試
                $conf=each($this->arr_conf);

                
    //找不到,返回 null
                if($conf==falsereturn null;

                
    if(strcmp($class_id,$conf["value"]["id"])===0){

                    
    //如果匹配則裝入類文件
                    include_once($conf["value"]["class_file"]);

                    
    //生成類的實(shí)例
                    //print_r($conf["value"]["class_name"]);

                    $obj=new $conf["value"]["class_name"]();

                    
    //查找被設(shè)置的屬性
                    $arr_prop=$conf["value"]["properties"];
                    
    while($prop=each($arr_prop)){
                        
    //生成屬性的設(shè)置方法 setXXX ,第一個(gè)字母大寫(xiě)
                        $set_method="set". ucwords($prop["value"]["name"]);

                        
    //調(diào)用設(shè)置方法,并設(shè)置預(yù)設(shè)值
                        $obj->$set_method($prop["value"]["value"]);
                    }

                    
    //找到第一個(gè),返回實(shí)例
                    return $obj;
                }
            }
        }
    }
    ?>

    最后說(shuō)一下,PHP是動(dòng)態(tài)語(yǔ)言,利用一些語(yǔ)言特性,實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,也沒(méi)用到反射之類的概念。要是用 Java 實(shí)現(xiàn)可能要復(fù)雜點(diǎn)。

    過(guò)兩天有時(shí)間再試一下PHP 版 AOP 面向切面。

    版權(quán)聲明:本博客文章如非特別注明,均為原創(chuàng),作者保留所有權(quán)利!歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者左洸和出處http://www.blogjava.net/myqiao

    posted on 2009-05-01 01:25 左洸 閱讀(6103) 評(píng)論(23)  編輯  收藏 所屬分類: PHP

    FeedBack:
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-01 03:16 | m
    為了用而實(shí)現(xiàn),為了實(shí)現(xiàn)而實(shí)現(xiàn)。

    你完成了后者。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-01 11:46 | 左洸
    @一樓

    你的回復(fù)不知道我能不能這樣理解:
    1、你認(rèn)為Php不需要用Ioc,所以我的實(shí)現(xiàn)不是為了用而實(shí)現(xiàn);
    2、你的方法學(xué)中除了為了用而實(shí)現(xiàn)、為了實(shí)現(xiàn)而實(shí)現(xiàn)之外,似乎還少了一條:為了理解而實(shí)現(xiàn)。
    3、如果以上兩條都不是,我只能理解為一樓已經(jīng)達(dá)到神仙級(jí)境界,需要的東西不需要有人先實(shí)現(xiàn),自己念念咒語(yǔ)就能拿來(lái)用了。
    4、最后明白一條道理:狐貍想吃葡萄,卻夠不著,那是因?yàn)槠咸咽撬岬摹?nbsp; 回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-01 15:06 | m
    從言語(yǔ)中得取益處的是仁智,俘獲疵漏的便是千慮。
    我只是想提醒你不要被技術(shù)蒙蔽,以至于本末倒置了。
    你這樣意氣用事,對(duì)你又有何提高呢,又何必賭氣回復(fù)。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-01 16:24 | 左洸
    @m
    m兄,恕我愚鈍,你的意思到底是根本不需要 Ioc?還是 Php 不需要Ioc?再或者是根本不需要Php?
    我花了幾個(gè)小時(shí)寫(xiě)了這些代碼當(dāng)然是為了用,學(xué)習(xí)Ioc的思想也是為了應(yīng)用中提高代碼質(zhì)量,控制變化。這個(gè)實(shí)現(xiàn)雖然有些粗糙,但是簡(jiǎn)潔實(shí)用。正是實(shí)用的風(fēng)格啊!所以你的兩次回復(fù)我還是沒(méi)搞明白你要說(shuō)什么。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-01 22:46 | wing5jface
    學(xué)而致用,多做準(zhǔn)備不是錯(cuò)的,模式是前人經(jīng)驗(yàn)的集合。支持探索。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-02 19:58 | sharenet
    同意一樓,我甚至認(rèn)為PHP不需要框架!  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-05-02 19:59 | sharenet
    @m
    同意一樓,我甚至認(rèn)為PHP不需要框架!   回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-06-05 14:01 | ycmhn
    不是打擊LZ我確實(shí)同意一樓那位
    php本身運(yùn)行機(jī)理和java不同,不能和java一樣在搞那么多框框架架之后還能頂?shù)米。琾hp的類開(kāi)銷是不能承受之重,因?yàn)樗幌駄ava一樣有app server
    在保持良好結(jié)構(gòu)的前提下盡量少用類,所以我認(rèn)為這些復(fù)雜的東西在php里有點(diǎn)故弄玄虛的感覺(jué)
    php用好函數(shù)和數(shù)組,就基本能解決全部問(wèn)題  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-06-05 14:03 | ycmhn
    php是簡(jiǎn)單的,類多一點(diǎn)后可能最后會(huì)慢的像爬的~  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2009-07-15 03:40 | ke
    @ycmhn

    說(shuō)得太夸張了!  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-08-03 10:41 | chuck911
    為什么php被認(rèn)為不適合做企業(yè)級(jí)應(yīng)用?那不是php語(yǔ)言有缺陷,而是因?yàn)閜hp太易上手,很容易就能做簡(jiǎn)單應(yīng)用,于是入門者就以為自己了解了這門語(yǔ)言,不做深究,導(dǎo)致php程序員平均素質(zhì)較低(至少國(guó)內(nèi)是這情況)。
    我不知道為什么這么多低級(jí)php程序員一齊出現(xiàn)在這里了...
    不用框架?就算你不懂OOP,你也需要代碼重用,做些library吧
    國(guó)外平均水平以上的php程序員都有自己的框架或者改造了流行的框架
    有些人就是沒(méi)有生活樂(lè)趣,總在做簡(jiǎn)單重復(fù)無(wú)味的工作,那你就去用naive php吧
    博主是個(gè)上進(jìn)的人~  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-08-27 14:27 | acheng7777
    博主的精神是值得贊揚(yáng)的,這事毫無(wú)疑問(wèn)的。我們總說(shuō)我們比其他動(dòng)物更加高級(jí),是因?yàn)槲覀儞碛辛艘豁?xiàng)很重要的技能--思考。技術(shù)之所以進(jìn)步是因?yàn)椴粩嘤腥嗽谔剿鳌⑼晟疲徊⒉皇悄憬裉炷脕?lái)用,明天再拿來(lái)用,這樣周而復(fù)始不加思考與總結(jié)就能發(fā)展的。那些不認(rèn)同博主的朋友們,你們可曾問(wèn)過(guò)自己這個(gè)問(wèn)題:在某項(xiàng)技術(shù)的發(fā)展過(guò)程中,你是想充當(dāng)參與其中的探索研究者,還是僅僅麻木的充當(dāng)一個(gè)使用者?孰是孰非其實(shí)是個(gè)很簡(jiǎn)單的問(wèn)題,我們何必裝作看不看呢!  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2009-09-22 17:44 | qq
    good
    lz的東東很有意思,正想找這方面的資料
    那些攻擊lz的都是些it民工,他們哪里明白程序的真滴, 不必理會(huì)  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-11-17 06:27 | Programmer Huang
    IOC和DI都是很有用的東西, 不管是什么語(yǔ)言中的. 這是一個(gè)設(shè)計(jì).
    當(dāng)然很多簡(jiǎn)單的項(xiàng)目, 不需要這么復(fù)雜的設(shè)計(jì).
    怎么設(shè)計(jì), 怎么用, 都要講究個(gè)度. 作者的探索精神是很好的, 支持你.
    而我主要想說(shuō)的是, 作者的理解應(yīng)該沒(méi)有錯(cuò)誤, 但實(shí)現(xiàn)錯(cuò)誤了.
    這個(gè)設(shè)計(jì)僅僅是個(gè)工廠模式, 是實(shí)現(xiàn)了IOC, 但沒(méi)有實(shí)現(xiàn)DI.
    DI應(yīng)該是讓你把En和Cn兩個(gè)類, 以參數(shù)的方式傳遞給要使用Hello接口的類.
    這里有我在PPC上的討論:
    http://bbs.phpchina.com/thread-164113-1-1.html
    7樓有我對(duì)你的設(shè)計(jì)的看法.   回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2010-08-18 13:57 | kk
    @Programmer Huang
    “這個(gè)設(shè)計(jì)僅僅是個(gè)工廠模式, 是實(shí)現(xiàn)了IOC, 但沒(méi)有實(shí)現(xiàn)DI. “ 我覺(jué)得這個(gè)說(shuō)的不是特別對(duì)。首先工廠方法和DI是兩個(gè)層面的東西,工廠方法可以實(shí)現(xiàn)DI,但是DI不局限在工廠方法的實(shí)現(xiàn)。lz這個(gè)實(shí)現(xiàn)已經(jīng)滿足了DI了,依賴由外部影響,不在程序內(nèi)部,簡(jiǎn)單來(lái)看就是配置文件代替了代碼的更改  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2012-04-20 14:02 | frank
    @ycmhn
    你的話自己在家里說(shuō)說(shuō)就可以,不要誤導(dǎo)新人,時(shí)下的php已經(jīng)發(fā)展成一個(gè)完全面向?qū)ο蟮恼Z(yǔ)言,zend以及眾多開(kāi)發(fā)者為實(shí)現(xiàn)php內(nèi)核部分的面向?qū)ο蟮母冻瞿愀艺f(shuō)是無(wú)用功?   回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2012-04-20 14:03 | frank
    @ycmhn
    無(wú)知不要賣弄。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2012-04-20 14:06 | frank
    不是打擊LZ我確實(shí)同意一樓那位
    php本身運(yùn)行機(jī)理和java不同,不能和java一樣在搞那么多框框架架之后還能頂?shù)米。琾hp的類開(kāi)銷是不能承受之重,因?yàn)樗幌駄ava一樣有app server
    在保持良好結(jié)構(gòu)的前提下盡量少用類,所以我認(rèn)為這些復(fù)雜的東西在php里有點(diǎn)故弄玄虛的感覺(jué)
    php用好函數(shù)和數(shù)組,就基本能解決全部問(wèn)題 回復(fù) 更多評(píng)論

    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2009-06-05 14:03 | ycmhn
    php是簡(jiǎn)單的,類多一點(diǎn)后可能最后會(huì)慢的像爬的~ 回復(fù) 更多評(píng)論

    ycmhn 看來(lái)真的很無(wú)知,php里沒(méi)有app server? 類多一點(diǎn)后可能最后會(huì)慢的像爬的? 你測(cè)試過(guò),

      回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2013-03-29 08:23 |
    博主2009年就知道Ioc了, 學(xué)習(xí)一下。

    不過(guò)這個(gè)設(shè)計(jì)沒(méi)有考慮singleton ,順便鄙視瞧不起php的各位。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2013-04-26 04:04 | 一無(wú)所得
    簡(jiǎn)單的同博主探討一下:我的理解是,依賴注入應(yīng)該是對(duì)依賴的解耦。
    你的Factory也好,json配置也好,目的應(yīng)該是幫助factory中的helloworld中耦合的對(duì)象解綁的,這個(gè)才是Ioc的直接目的。Facotry和您的json都是為了這個(gè)目的而加上去的設(shè)施,對(duì)嗎?
    目測(cè)helloworld中沒(méi)有耦合的對(duì)象,自然談不上Ioc。不知博主是否這樣認(rèn)為的?
    現(xiàn)在時(shí)間距樓主發(fā)帖已經(jīng)過(guò)去好幾年了,相信樓主早就明白這些事情了。不過(guò),為了后來(lái)人起見(jiàn),我把網(wǎng)上另外一篇文章的地址貼在這里
    http://blog.sina.com.cn/s/blog_7141dace0100lopb.html
    應(yīng)該很好的說(shuō)明了為什么要用Ioc。  回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2013-09-11 10:44 | zongtong
    你用過(guò)框架沒(méi)。@ycmhn
      回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2013-09-11 10:48 | zongtong
    個(gè)人覺(jué)得這些東西,在比較大的團(tuán)隊(duì)項(xiàng)目協(xié)作里面,作用提現(xiàn)的比較大.如果一個(gè)項(xiàng)目就只有一兩個(gè)人來(lái)自做,完全沒(méi)必要搞那些。

    如果你的項(xiàng)目設(shè)計(jì)目的就是為了適應(yīng)很多用戶(開(kāi)發(fā)者),比如你就想做一個(gè)開(kāi)發(fā)框架之類的(當(dāng)然開(kāi)發(fā)框架的存在意義不是這個(gè)討論的主題),這些IOC等等的設(shè)計(jì)模式就顯得蠻重要的了。
    @frank
      回復(fù)  更多評(píng)論
      
    # re: 用PHP實(shí)現(xiàn)簡(jiǎn)單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄](méi)
    2016-04-08 10:25 | a
    2016年了,這篇博客也有個(gè)年頭了,看到一樓以及一樓的支持者,Lavarel和composer打臉不?一群無(wú)頭蒼蠅裝大蒜,該死!  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 在线永久看片免费的视频| 3344免费播放观看视频| 久久久久久久99精品免费观看| 久久精品免费视频观看| av无码免费一区二区三区| 影音先锋在线免费观看| 亚洲&#228;v永久无码精品天堂久久 | 国产色爽免费视频| 亚洲精品一级无码中文字幕| 亚洲AV永久纯肉无码精品动漫| 亚洲影视一区二区| 国产精品亚洲综合| 免费国产污网站在线观看| 一二三四在线播放免费观看中文版视频| 日美韩电影免费看| 亚洲AV无码久久精品色欲| 亚洲一区精彩视频| 久久av免费天堂小草播放| 在线永久免费的视频草莓| 亚洲精品无码久久久久AV麻豆| 在线电影你懂的亚洲| 精品久久久久久亚洲综合网| 国产激情免费视频在线观看 | 午夜影院免费观看| 国外成人免费高清激情视频| 国产亚洲一区二区手机在线观看| 亚洲国产日韩精品| 日本免费A级毛一片| 永久免费看mv网站入口| 亚洲AV无码久久精品蜜桃| 亚洲AV无码一区二区三区性色| 免费91麻豆精品国产自产在线观看| 最近的免费中文字幕视频| 国产精品亚洲一区二区三区在线| 亚洲精品二三区伊人久久| 天堂在线免费观看| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 人禽伦免费交视频播放| 国产精品久久久久免费a∨| 国产成人亚洲精品狼色在线| 亚洲色精品VR一区区三区|