一、編寫(xiě) Hello 的 POJO,一個(gè) Hello 接口,兩個(gè)類實(shí)現(xiàn)這個(gè)接口的 sayHello() 方法。其中,中文版 CnHello 類,顯示中文問(wèn)候;英文 EnHello 類,顯示英文問(wèn)候。
自己看代碼吧,很簡(jiǎn)單:
版權(quán)聲明:本博客文章如非特別注明,均為原創(chuàng),作者保留所有權(quán)利!歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者
左洸和出處
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ì)了一個(gè)配置文件,使用 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":"世界你好!"
}
]
}
]

三、測(cè)試。為類工廠指定上述配置文件。我們可以看見(jiàn),對(duì)配置文件里的不同ID,返回了不同的類實(shí)例。調(diào)用每個(gè)實(shí)例的方法,分別輸出了中文問(wèn)候和英文問(wèn)候。
可見(jiàn),我們只需要改變配置文件的內(nèi)容,就可以返回不同的類實(shí)例,而不需修改程序源代碼。這就實(shí)現(xiàn)了簡(jiǎ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!
中文版世界你好!
四、
類工廠閃亮登場(chǎng)。實(shí)現(xiàn)了一些簡(jiǎn)單功能,能夠解析指定的配置文件,并根據(jù)配置文件生成類,同時(shí)設(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){
//挨個(gè)測(cè)試
$conf=each($this->arr_conf);

//找不到,返回 null
if($conf==false) return 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è)字母大寫(xiě)
$set_method="set". ucwords($prop["value"]["name"]);

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

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

最后說(shuō)一下,PHP是動(dòng)態(tài)語(yǔ)言,利用一些語(yǔ)言特性,實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,也沒(méi)用到反射之類的概念。要是用 Java 實(shí)現(xiàn)可能要復(fù)雜點(diǎn)。
過(guò)兩天有時(shí)間再試一下PHP 版 AOP 面向切面。
版權(quán)聲明:本博客文章如非特別注明,均為原創(chuàng),作者保留所有權(quán)利!歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者
左洸和出處
http://www.blogjava.net/myqiao
posted on 2009-05-01 01:25
左洸 閱讀(6103)
評(píng)論(23) 編輯 收藏 所屬分類:
PHP