最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解和運用PHP中的多態(tài)性[譯]

 更新時間:2011年08月02日 19:05:22   作者:  
在面向?qū)ο缶幊?,多態(tài)性是一個強大的和基本的工具。它可以用來在您的應用程序建立一個更有機的流。本教程將介紹多態(tài)性的籠統(tǒng)的概念,以及它如何在PHP中可以很容易地部署。
什么是多態(tài)性?
Polymorphism(多態(tài)性)是一個很長的單詞,但是它表示的是一個非常簡單的概念。
多態(tài)性描述了在面向?qū)ο缶幊棠J街蓄愑胁煌墓δ?,而共享一個通用的接口。
多態(tài)性的優(yōu)點是,并不需要知道它使用的是哪一個類,因為他們都用同樣的方式與不同的類的代碼工作。
可將多態(tài)性類比成現(xiàn)實世界的一個按鈕。大家都知道如何使用一個按鈕:您只需給它施加壓力。一個按鈕“確實是這樣”,然而,取決于它和什么連接和使用它的上下文 - 但結(jié)果并不影響它是如何使用。如果你的老板告訴你按下一個按鈕,您已經(jīng)有執(zhí)行任務所需的所有信息。
在編程的世界中,多態(tài)性是用來使應用程序更加模塊化和可擴展的。相比于凌亂的條件語句描述的行動不同的課程,您可以創(chuàng)建根據(jù)您的需求選擇的互換對象。這是多態(tài)性的基本目標。
Interfaces接口
接口是與類(class)類似的,除了它不能包含代碼。接口可以定義方法名稱和參數(shù),但不是方法的內(nèi)容。實現(xiàn)接口的任何類都必須實現(xiàn)接口中定義的所有方法。一個類可以實現(xiàn)多個接口。
使用的“interface”關鍵字聲明一個接口:
復制代碼 代碼如下:

interface MyInterface {
// methods
}

被附加到一個類,使用“implements”關鍵字(多個接口,可以通過用逗號分開):
復制代碼 代碼如下:

class MyClass implements MyInterface {
// methods
}

在接口中可以像在類中一樣定義方法,除了沒有方法體(在大括號中的部分)以外。
復制代碼 代碼如下:

interface MyInterface {
public function doThis();
public function doThat();
public function setName($name);
}

在這里定義的所有方法都必須如接口中所描述地那樣被包含在任何實現(xiàn)它的類中。(讀下面的代碼注釋)
復制代碼 代碼如下:

//合法的 VALID
class MyClass implements MyInterface {
protected $name;
public function doThis() {
// code that does this
}
public function doThat() {
// code that does that
}
public function setName($name) {
$this->name = $name;
}
}
// 非法的INVALID
class MyClass implements MyInterface {
// missing doThis()!
private function doThat() {
// this should be public!
}
public function setName() {
// missing the name argument!
}
}

抽象類Abstract Class
抽象類是接口和類的混合。它可以像接口一樣定義方法。繼承自抽象類的類必須實現(xiàn)抽象類中定義的所有抽象方法。
抽象類的定義方式與類一樣,不過是在前面附加了一個abstract 關鍵字。
復制代碼 代碼如下:

abstract class MyAbstract {
// methods
}

并且 是用 ‘extends‘ 關鍵字附加到類:
復制代碼 代碼如下:

class MyClass extends MyAbstract {
// class methods
}

就像在普通類中一樣,普通的方法以及任何抽象方法(使用關鍵字“abstract”)可以在抽象類中定義。抽象方法的行為就像在接口中定義的的方法,而且繼承它的擴展類中必須實現(xiàn)完全一樣的定義。
復制代碼 代碼如下:

abstract class MyAbstract {
public $name;
public function doThis() {
// do this
}
abstract public function doThat();
abstract public function setName($name);
}

我們假設你有一個文章Article類負責管理你網(wǎng)站上的文章。它包含關于文章的信息,包括:title, author, date, and category.
就像下面這樣:
復制代碼 代碼如下:

class poly_base_Article {
public $title;
public $author;
public $date;
public $category;
public function __construct($title, $author, $date, $category = 0) {
$this->title = $title;
$this->author = $author;
$this->date = $date;
$this->category = $category;
}
}

注意:在這個教程中的示例類使用了“package_component_Class”的命名約定,這是一個用來將類名分隔到虛擬的命名空間來避免命名沖突的通用方法。
現(xiàn)在你想添加一個方法來輸出各種不同格式的信息,如XML和JSON。你也許會打算像下面這樣做:
復制代碼 代碼如下:

class poly_base_Article {
//...
public function write($type) {
$ret = '';
switch($type) {
case 'XML':
$ret = '';
$ret .= '';
$ret .= '' . $obj->author . '';
$ret .= '' . $obj->date . '';
$ret .= '' . $obj->category . '';
$ret .= '';
break;
case 'JSON':
$array = array('article' => $obj);
$ret = json_encode($array);
break;
}
return $ret;
}
}

這種解決方案是丑陋的,但是它是可靠的——至少在現(xiàn)在。問下你自己將來會發(fā)生什么,當我們需要添加更多格式的時候?你可以繼續(xù)編輯這個類,然后添加越來越多的case ,
但是現(xiàn)在你只是在稀釋(FIX ME: diluting) 你的類。
OOP的一個重要原則是一個類應該做的一件事情,而應該把它做好。
考慮到這一點,條件語句應該是一個紅色的標志,表明你的類是試圖做太多不同的東西。這是多態(tài)性的用武之地。
在我們的例子中,有兩個任務明確的提出:管理文章和格式化其數(shù)據(jù)。在本教程中,我們將重構我們的格式化代碼到一個新的類,然后我們會發(fā)現(xiàn)使用多態(tài)性是多么容易。
Step 2: 定義你的接口 Define Your Interface
第一件事就是我們應該定義接口,努力想好怎么定義你的接口是件重要的事情,因為對它的任何改變都將需要改動調(diào)用它的代碼。
在我們這個例子中,我們將使用一個簡單的接口來定義一個方法:
復制代碼 代碼如下:

interface poly_writer_Writer {
public function write(poly_base_Article $obj);
}

它就是那樣簡單,我們已經(jīng)定義了一個公用方法write() ,它接受一個文章對象作為參數(shù)。任何實現(xiàn)Writer接口的類都將會確保有這個方法。
小提示:如果你想嚴格限制傳遞給你的方法和函數(shù)的參數(shù)類型,你可以使用類型提示,就像我們已經(jīng)在write()方法中做的一樣,它只能接受poly_base_Article 對象類型的數(shù)
據(jù)。不幸的是,在目前版本的PHP中,返回類型提示是不被支持的,所以,你要小心返回值的類型了。
Step 3: 創(chuàng)建實現(xiàn)類 Create Your Implementation
定義接口后,該是時候來創(chuàng)建類來真正干活的啦。在我們的例子中,我們需要輸出兩種格式。這樣,我們就要兩個Writer 類:XMLWriter 和 JSONWriter 。從傳遞過來的
Article 對象提取數(shù)據(jù)然后格式化這些信息完全取決于這些類了。
下面是 XMLWriter 類的一個示例:
復制代碼 代碼如下:

class poly_writer_XMLWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$ret = '';
$ret .= '';
$ret .= '' . $obj->author . '';
$ret .= '' . $obj->date . '';
$ret .= '' . $obj->category . '';
$ret .= '';
return $ret;
}
}

就如你可以從類定義中看到的一樣,我們使用implements關鍵字來實現(xiàn)我們的接口。write() 方法包含格式化為XML的功能。
現(xiàn)在我們來看下JSONWriter 類:
復制代碼 代碼如下:

class poly_writer_JSONWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$array = array('article' => $obj);
return json_encode($array);
}
}

現(xiàn)在,我們的代碼中的特定每種格式都包含在單獨的類。每個類有全權負責處理特定的格式,而不是其他。您的應用程序中沒有其他部分需要關心這些是如何工作的才能使用它,
感謝我們的接口。
Step 4: 使用你的接口Use Your Implementation
在我們的新類定義后,該是時候來重溫一下我們的Article類了,所有原write() 方法中的代碼已經(jīng)被分離出來,進入到我們的新類中了。
我們的所有方法現(xiàn)在需要做的就是使用這些新的類,像這樣:
復制代碼 代碼如下:

class poly_base_Article {
//...
public function write(poly_writer_Writer $writer) {
return $writer->write($this);
}
}

獲取一個 Writer對象 Obtaining A Writer
你也許會疑惑你該從哪里獲取一個 Writer對象開始,因為你需要傳遞一個 Writer對象到這個方法。
這完全取決于你,并且,有很多策略。如,你可能會使用工廠類來獲取請求數(shù)據(jù)然后創(chuàng)建一個對象:
復制代碼 代碼如下:

class poly_base_Factory {
public static function getWriter() {
// grab request variable
$format = $_REQUEST['format'];
// construct our class name and check its existence
$class = 'poly_writer_' . $format . 'Writer';
if(class_exists($class)) {
// return a new Writer object
return new $class();
}
// otherwise we fail
throw new Exception('Unsupported format');
}
}

就像我說的,根據(jù)你的需求,有好多其它策略可用。在這個例子中,通過一個請求變量選擇哪種格式是要使用的。它基于request請求變量來構造一個類名,檢測它是否存在,
然后返回一個新的Writer對象。如果沒有那個名字的類存在,拋出一個異常,讓客戶端代碼決定接下來要干什么。
Step 5: 把它們放一起 Put It All Together
當所有東東都到位了,下面是我們的客戶端代碼如何放在一起:
復制代碼 代碼如下:

$article = new poly_base_Article('Polymorphism', 'Steve', time(), 0);
try {
$writer = poly_base_Factory::getWriter();
}
catch (Exception $e) {
$writer = new poly_writer_XMLWriter();
}
echo $article->write($writer);

首先,我們創(chuàng)建了一個示例 Article 對象來配合工作。然后,我們試圖從工廠Factory獲取一個Factory對象,如果異常發(fā)生的話回滾到默認(XMLWriter) 。
最后,我們傳遞Writer對象給我們的Article的 write() 方法,輸出結(jié)果。
結(jié)論 Conclusion

在本教程中,我提供了一個多態(tài)性的簡介而且解釋了PHP中的接口。我希望你意識到,我只向您展示一個潛在的使用多態(tài)性的案例。
多態(tài)性是以一個優(yōu)雅的方式來避免您的OOP代碼中丑陋的條件語句。它遵循的原則是使您的組件分離,而且它是許多設計模式的組成部分。如果您有任何問題,不要猶豫,在評論中提問!
譯自:http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/
原文發(fā)表在:http://ihacklog.com/?p=4703

相關文章

  • PHP如何解決網(wǎng)站大流量與高并發(fā)的問題

    PHP如何解決網(wǎng)站大流量與高并發(fā)的問題

    普通的P4服務器一般最多能支持每天10萬獨立IP,如果訪問量比這個還要大,那么必須首先配置一臺更高性能的專用服務器才能解決問題
    2011-06-06
  • javascript 小型動畫組件與實現(xiàn)代碼

    javascript 小型動畫組件與實現(xiàn)代碼

    javascript 小型動畫組件與實現(xiàn)代碼,想要學習js動畫的朋友可以參考下。思路確實很實用。
    2010-06-06
  • 織夢模板標記簡介

    織夢模板標記簡介

    織夢模板標記簡介...
    2007-03-03
  • PHP的面試題集

    PHP的面試題集

    PHP的面試題集...
    2006-11-11
  • php中并發(fā)讀寫文件沖突的解決方案

    php中并發(fā)讀寫文件沖突的解決方案

    在這里提供4種高并發(fā)讀寫文件的方案,各有優(yōu)點,可以根據(jù)自己的情況解決php并發(fā)讀寫文件沖突的問題。
    2013-10-10
  • 40個跡象表明你還是PHP菜鳥

    40個跡象表明你還是PHP菜鳥

    英文版權歸Reinhold Weber所有,中譯文作者yangyang(aka davidkoree)。雙語版可用于非商業(yè)傳播,但須注明英文版作者、版權信息,以及中譯文作者。翻譯水平有限,請廣大PHPer指正。
    2008-09-09
  • PHP 5.3.0 安裝分析心得

    PHP 5.3.0 安裝分析心得

    話說,一直犯懶沒下載一個PHP 5.3,今天看到關于PHP5.3.0一時興起打算更新一下本本上的PHP,于是乎下載了5.3來裝。
    2009-08-08
  • PHP.vs.JAVA

    PHP.vs.JAVA

    php在諸多方面都不如java優(yōu)異,那么php開發(fā)出的oa產(chǎn)品何以與java產(chǎn)品競爭呢?在于Php陣營普遍走的是低端路線,而java陣營走的是中高端路線。兩者之間交叉的區(qū)域較小。
    2016-04-04
  • PH P5.2至5.5、5.6的新增功能詳解

    PH P5.2至5.5、5.6的新增功能詳解

    本文將會介紹自 PHP5.2 起,直至 PHP5.6 中增加的新特征,需要的朋友可以參考下
    2014-07-07
  • 對PHP語言認識上需要避免的10大誤區(qū)

    對PHP語言認識上需要避免的10大誤區(qū)

    PHP是一種非常流行的開源服務器端腳本語言,你在萬維網(wǎng)看到的大多數(shù)網(wǎng)站都是使用php開發(fā)的。很多人不用php并不是因為一些被證實的語言缺點。他們決定不用php,是因為誤解。
    2014-06-06

最新評論

耒阳市| 沐川县| 盐城市| 曲阳县| 利辛县| 廊坊市| 专栏| 开平市| 南阳市| 南雄市| 绥化市| 金乡县| 文登市| 榆中县| 临泽县| 禹州市| 罗源县| 莆田市| 吴忠市| 岑巩县| 常熟市| 天峨县| 红桥区| 长岭县| 赤城县| 清远市| 阳春市| 曲松县| 辽阳市| 陇西县| 泸定县| 永福县| 永兴县| 娄烦县| 施秉县| 新昌县| 古交市| 凉山| 蚌埠市| 西宁市| 黄龙县|