<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 接口,兩個類實現(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://m.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è)計了一個配置文件,使用 JSON 格式,里面有注釋,看看就明白了
    //作者:左洸
    //
    http://m.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,返回了不同的類實例。調(diào)用每個實例的方法,分別輸出了中文問候和英文問候。可見,我們只需要改變配置文件的內(nèi)容,就可以返回不同的類實例,而不需修改程序源代碼。這就實現(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!
    中文版世界你好!

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

    /**
     * Description of ClassFactory
     *
     * @author 左洸  http://m.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"]);

                    
    //生成類的實例
                    //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"]);
                    }

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

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

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

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

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

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

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

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

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

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

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

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

    不過這個設(shè)計沒有考慮singleton ,順便鄙視瞧不起php的各位。  回復(fù)  更多評論
      
    # re: 用PHP實現(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實現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2013-09-11 10:44 | zongtong
    你用過框架沒。@ycmhn
      回復(fù)  更多評論
      
    # re: 用PHP實現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
    2013-09-11 10:48 | zongtong
    個人覺得這些東西,在比較大的團(tuán)隊項目協(xié)作里面,作用提現(xiàn)的比較大.如果一個項目就只有一兩個人來自做,完全沒必要搞那些。

    如果你的項目設(shè)計目的就是為了適應(yīng)很多用戶(開發(fā)者),比如你就想做一個開發(fā)框架之類的(當(dāng)然開發(fā)框架的存在意義不是這個討論的主題),這些IOC等等的設(shè)計模式就顯得蠻重要的了。
    @frank
      回復(fù)  更多評論
      
    # re: 用PHP實現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄]
    2016-04-08 10:25 | a
    2016年了,這篇博客也有個年頭了,看到一樓以及一樓的支持者,Lavarel和composer打臉不?一群無頭蒼蠅裝大蒜,該死!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲综合色区在线观看| 午夜高清免费在线观看| 亚洲狠狠婷婷综合久久久久| 国产亚洲美女精品久久| 在线免费观看韩国a视频| 亚洲香蕉久久一区二区| 99久久99久久精品免费看蜜桃| 久久久无码精品亚洲日韩按摩| 在线a免费观看最新网站| 久久久久亚洲av无码专区喷水 | 国产午夜亚洲精品不卡免下载| 日本一道本高清免费| 亚洲av最新在线观看网址| 国产精品免费视频一区| 国产精品亚洲专区在线播放| 午夜亚洲国产成人不卡在线| 四虎精品免费永久免费视频| 亚洲综合无码精品一区二区三区 | 亚洲av专区无码观看精品天堂| 免费视频爱爱太爽了| 亚洲一区二区三区成人网站| 午夜精品在线免费观看| 免费看黄网站在线看 | 狠狠亚洲狠狠欧洲2019| 久久久精品视频免费观看| 亚洲综合成人网在线观看| 四虎永久在线精品免费网址| 理论亚洲区美一区二区三区 | 亚洲欧洲日产专区| 成人免费网站在线观看| 无码精品人妻一区二区三区免费 | 亚洲精品精华液一区二区| 免费在线不卡视频| 永久免费av无码网站yy| 久久综合久久综合亚洲| 亚洲国产aⅴ综合网| 久久国产免费观看精品3| 色欲aⅴ亚洲情无码AV蜜桃| 国产亚洲无线码一区二区 | 香港特级三A毛片免费观看| 亚洲尤码不卡AV麻豆|