<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
    一、編寫 Hello 的 POJO,一個 Hello 接口,兩個類實(shí)現(xiàn)這個接口的 sayHello() 方法。其中,中文版 CnHello 類,顯示中文問候;英文 EnHello 類,顯示英文問候。
    自己看代碼吧,很簡單:

    版權(quán)聲明:本博客文章如非特別注明,均為原創(chuàng),作者保留所有權(quán)利!歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者左洸和出處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ì)了一個配置文件,使用 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":"世界你好!"
                }

            ]
        }

    ]

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

    四、類工廠閃亮登場。實(shí)現(xiàn)了一些簡單功能,能夠解析指定的配置文件,并根據(jù)配置文件生成類,同時設(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){
                
    //挨個測試
                $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 ,第一個字母大寫
                        $set_method="set". ucwords($prop["value"]["name"]);

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

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

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

    過兩天有時間再試一下PHP 版 AOP 面向切面。

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

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

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

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

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

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

    ycmhn 看來真的很無知,php里沒有app server? 類多一點(diǎn)后可能最后會慢的像爬的? 你測試過,

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

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

    如果你的項(xiàng)目設(shè)計(jì)目的就是為了適應(yīng)很多用戶(開發(fā)者),比如你就想做一個開發(fā)框架之類的(當(dāng)然開發(fā)框架的存在意義不是這個討論的主題),這些IOC等等的設(shè)計(jì)模式就顯得蠻重要的了。
    @frank
      回復(fù)  更多評論
      
    # re: 用PHP實(shí)現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄]
    2016-04-08 10:25 | a
    2016年了,這篇博客也有個年頭了,看到一樓以及一樓的支持者,Lavarel和composer打臉不?一群無頭蒼蠅裝大蒜,該死!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲嫩草影院在线观看| 免费又黄又爽又猛的毛片 | 久久99亚洲网美利坚合众国| 亚洲综合无码AV一区二区| 亚洲高清成人一区二区三区 | 暖暖在线视频免费视频| 久久精品成人免费网站| 国产成人免费视频| 91久久精品国产免费一区| 亚洲免费视频观看| 91成年人免费视频| 成人av免费电影| 免费看国产一级特黄aa大片| 亚洲不卡无码av中文字幕| 久久青青草原亚洲av无码| 狠狠色伊人亚洲综合成人| 久久久久久久亚洲Av无码| 亚洲午夜成激人情在线影院| 亚洲中文字幕一区精品自拍| 亚洲AV成人片无码网站| 天堂亚洲免费视频| 免费播放在线日本感人片| 8x8x华人永久免费视频| 好先生在线观看免费播放| 国产一精品一aⅴ一免费| 在线观看亚洲精品国产| 亚洲日韩区在线电影| 亚洲av无码电影网| 国产亚洲欧美在线观看| 成av免费大片黄在线观看 | 亚洲av成人一区二区三区观看在线 | 亚洲人成毛片线播放| 亚洲成AV人片在WWW| 国产国产人免费人成成免视频| 国产免费AV片在线观看| 无码国产精品一区二区免费虚拟VR| 日韩免费视频观看| 亚洲女初尝黑人巨高清| 亚洲欧洲春色校园另类小说| 久久久久久久久无码精品亚洲日韩| 国产精品免费大片一区二区|