posts - 48,comments - 156,trackbacks - 0
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          積分與排名

          • 積分 - 157247
          • 排名 - 385

          最新評論

          閱讀排行榜

          評論排行榜

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

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

          Hello.php
          <?php

          /**
           * @author 左洸,http://www.aygfsteel.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.aygfsteel.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)用每個(gè)實(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í)設(shè)置指定的屬性值,注釋很詳細(xì),我就不多解釋了。代碼如下:
          ClassFactory.php
          <?php

          /**
           * Description of ClassFactory
           *
           * @author 左洸  http://www.aygfsteel.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è)測試
                      $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è)字母大寫
                              $set_method="set". ucwords($prop["value"]["name"]);

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

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

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

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

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

          posted on 2009-05-01 01:25 左洸 閱讀(6109) 評論(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?
          我花了幾個(gè)小時(shí)寫了這些代碼當(dāng)然是為了用,學(xué)習(xí)Ioc的思想也是為了應(yīng)用中提高代碼質(zhì)量,控制變化。這個(gè)實(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)備不是錯(cuò)的,模式是前人經(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)后可能最后會(huì)慢的像爬的~  回復(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吧
          博主是個(gè)上進(jìn)的人~  回復(fù)  更多評論
            
          # re: 用PHP實(shí)現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
          2009-08-27 14:27 | acheng7777
          博主的精神是值得贊揚(yáng)的,這事毫無疑問的。我們總說我們比其他動(dòng)物更加高級,是因?yàn)槲覀儞碛辛艘豁?xiàng)很重要的技能--思考。技術(shù)之所以進(jìn)步是因?yàn)椴粩嘤腥嗽谔剿?、完善;并不是你今天拿來用,明天再拿來用,這樣周而復(fù)始不加思考與總結(jié)就能發(fā)展的。那些不認(rèn)同博主的朋友們,你們可曾問過自己這個(gè)問題:在某項(xiàng)技術(shù)的發(fā)展過程中,你是想充當(dāng)參與其中的探索研究者,還是僅僅麻木的充當(dāng)一個(gè)使用者?孰是孰非其實(shí)是個(gè)很簡單的問題,我們何必裝作看不看呢!  回復(fù)  更多評論
            
          # re: 用PHP實(shí)現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄]
          2009-09-22 17:44 | qq
          good
          lz的東東很有意思,正想找這方面的資料
          那些攻擊lz的都是些it民工,他們哪里明白程序的真滴, 不必理會(huì)  回復(fù)  更多評論
            
          # re: 用PHP實(shí)現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件
          2009-11-17 06:27 | Programmer Huang
          IOC和DI都是很有用的東西, 不管是什么語言中的. 這是一個(gè)設(shè)計(jì).
          當(dāng)然很多簡單的項(xiàng)目, 不需要這么復(fù)雜的設(shè)計(jì).
          怎么設(shè)計(jì), 怎么用, 都要講究個(gè)度. 作者的探索精神是很好的, 支持你.
          而我主要想說的是, 作者的理解應(yīng)該沒有錯(cuò)誤, 但實(shí)現(xiàn)錯(cuò)誤了.
          這個(gè)設(shè)計(jì)僅僅是個(gè)工廠模式, 是實(shí)現(xiàn)了IOC, 但沒有實(shí)現(xiàn)DI.
          DI應(yīng)該是讓你把En和Cn兩個(gè)類, 以參數(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
          “這個(gè)設(shè)計(jì)僅僅是個(gè)工廠模式, 是實(shí)現(xiàn)了IOC, 但沒有實(shí)現(xiàn)DI. “ 我覺得這個(gè)說的不是特別對。首先工廠方法和DI是兩個(gè)層面的東西,工廠方法可以實(shí)現(xiàn)DI,但是DI不局限在工廠方法的實(shí)現(xiàn)。lz這個(gè)實(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)新人,時(shí)下的php已經(jīng)發(fā)展成一個(gè)完全面向?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ù)米?,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)后可能最后會(huì)慢的像爬的~ 回復(fù) 更多評論

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

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

          不過這個(gè)設(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中耦合的對象解綁的,這個(gè)才是Ioc的直接目的。Facotry和您的json都是為了這個(gè)目的而加上去的設(shè)施,對嗎?
          目測helloworld中沒有耦合的對象,自然談不上Ioc。不知博主是否這樣認(rèn)為的?
          現(xiàn)在時(shí)間距樓主發(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
          個(gè)人覺得這些東西,在比較大的團(tuán)隊(duì)項(xiàng)目協(xié)作里面,作用提現(xiàn)的比較大.如果一個(gè)項(xiàng)目就只有一兩個(gè)人來自做,完全沒必要搞那些。

          如果你的項(xiàng)目設(shè)計(jì)目的就是為了適應(yīng)很多用戶(開發(fā)者),比如你就想做一個(gè)開發(fā)框架之類的(當(dāng)然開發(fā)框架的存在意義不是這個(gè)討論的主題),這些IOC等等的設(shè)計(jì)模式就顯得蠻重要的了。
          @frank
            回復(fù)  更多評論
            
          # re: 用PHP實(shí)現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄]
          2016-04-08 10:25 | a
          2016年了,這篇博客也有個(gè)年頭了,看到一樓以及一樓的支持者,Lavarel和composer打臉不?一群無頭蒼蠅裝大蒜,該死!  回復(fù)  更多評論
            
          主站蜘蛛池模板: 绩溪县| 永靖县| 师宗县| 文昌市| 通辽市| 乌鲁木齐市| 昌都县| 绵阳市| 金华市| 庆城县| 饶阳县| 湖口县| 南宁市| 临西县| 永济市| 三门县| 宜春市| 建宁县| 北票市| 闽侯县| 常山县| 东辽县| 山西省| 迁西县| 彰化县| 遵义市| 华池县| 县级市| 平舆县| 景德镇市| 上高县| 内丘县| 九龙坡区| 瑞安市| 时尚| 获嘉县| 叙永县| 宝应县| 中山市| 吴堡县| 莫力|