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

    版權聲明:本博客文章如非特別注明,均為原創,作者保留所有權利!歡迎轉載,轉載請注明作者左洸和出處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;
        }
    }

    ?>


    二、自己設計了一個配置文件,使用 JSON 格式,里面有注釋,看看就明白了
    //作者:左洸
    //
    http://www.tkk7.com/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.tkk7.com/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 左洸 閱讀(6103) 評論(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打臉不?一群無頭蒼蠅裝大蒜,該死!  回復  更多評論
      
    主站蜘蛛池模板: 中文字幕专区在线亚洲| 亚洲黄色中文字幕| 毛片无码免费无码播放| 2019亚洲午夜无码天堂| 亚洲福利精品电影在线观看| 久久精品乱子伦免费| 亚洲最大的成人网| 亚洲精品无码久久一线| 久久综合AV免费观看| 精品国产免费人成网站| 亚洲va乱码一区二区三区| 亚洲欧洲久久av| 动漫黄网站免费永久在线观看| 免费一级做a爰片久久毛片潮| 亚洲自偷自拍另类12p| 日韩在线免费播放| 99在线观看精品免费99| 最好2018中文免费视频| 亚洲成人网在线播放| 亚洲中文字幕无码久久综合网 | 免费三级毛片电影片| 无遮挡呻吟娇喘视频免费播放| 久久久亚洲裙底偷窥综合| 亚洲va中文字幕无码| 91情侣在线精品国产免费| 久久久久国色AV免费观看| 亚洲国产AV一区二区三区四区 | 亚洲中文字幕一区精品自拍| 国产成A人亚洲精V品无码| 日本19禁啪啪无遮挡免费动图| 最近高清中文字幕免费| 成人一区二区免费视频| 亚洲精品色在线网站| 亚洲最大的黄色网| 亚洲av女电影网| 国产亚洲精品资在线| 国产公开免费人成视频| 免费无遮挡无码视频网站| 国产又大又粗又长免费视频| 午夜免费福利视频| 久久免费观看视频|