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://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è)計了一個配置文件,使用 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,返回了不同的類實例。調(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è)置指定的屬性值,注釋很詳細,我就不多解釋了。代碼如下:
          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){
                      
          //挨個測試
                      $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è)置預設(shè)值
                              $obj->$set_method($prop["value"]["value"]);
                          }

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

          最后說一下,PHP是動態(tài)語言,利用一些語言特性,實現(xiàn)起來很簡單,也沒用到反射之類的概念。要是用 Java 實現(xià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 左洸 閱讀(6106) 評論(23)  編輯  收藏 所屬分類: PHP

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

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

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

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

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

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

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

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

          如果你的項目設(shè)計目的就是為了適應很多用戶(開發(fā)者),比如你就想做一個開發(fā)框架之類的(當然開發(fā)框架的存在意義不是這個討論的主題),這些IOC等等的設(shè)計模式就顯得蠻重要的了。
          @frank
            回復  更多評論
            
          # re: 用PHP實現(xiàn)簡單的控制反轉(zhuǎn)(IOC) 依賴注入(DI),用JSON配置文件[未登錄]
          2016-04-08 10:25 | a
          2016年了,這篇博客也有個年頭了,看到一樓以及一樓的支持者,Lavarel和composer打臉不?一群無頭蒼蠅裝大蒜,該死!  回復  更多評論
            
          主站蜘蛛池模板: 万安县| 印江| 瓦房店市| 礼泉县| 兴业县| 喜德县| 耿马| 昭苏县| 聂荣县| 巩义市| 河南省| 新巴尔虎右旗| 黄龙县| 侯马市| 昆明市| 漳州市| 镇康县| 蓬溪县| 霍山县| 多伦县| 县级市| 宝清县| 乌恰县| 宁城县| 施秉县| 互助| 安乡县| 江川县| 易门县| 环江| 根河市| 乾安县| 金溪县| 巩义市| 连江县| 洪湖市| 常州市| 鲁甸县| 临湘市| 宜春市| 和静县|