PHP5多態(tài)性與動態(tài)綁定介紹
什么是多態(tài)性?
多態(tài)性是繼數(shù)據(jù)抽象和繼承后,面向?qū)ο笳Z言的第三個特征。從字面上理解,多態(tài)的意思是“多種形態(tài)”,簡單來說,多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征,在OO中是指“語言具有根據(jù)對象的類型以不同方式處理之,特別是重載方法和繼承類這種形式”的能力。多態(tài)被認(rèn)為是面向?qū)ο笳Z言的必備特性。
例如:
我們創(chuàng)建一個接口 Shape,定義一個空的方法 draw(),那么所有的實(shí)現(xiàn)類都必須實(shí)現(xiàn)這個方法,假設(shè) Shape 有兩個實(shí)現(xiàn)類:Triangle 和 Rectangle,我們雖然無法通過類似這樣的 Java 代碼來詮釋 PHP 的多態(tài)性:
Shape s = new Triangle();
s.draw();
不過 PHP5.1 中引入了 Type Hinting,可以限制函數(shù)(或者方法)的參數(shù)類型,我們使用這個特性來演示 PHP5 的多態(tài)性。
參考如下的代碼:
class TestPolymorphism {
public function drawNow(Shape $shape) {
$shape->draw();
}
}
函數(shù) drawNow() 中限制傳入的參數(shù)類型必須為 Shape 接口派生類的對象,這里我們傳遞給 drawNow() 的參數(shù)可能是 Triangle 或者 Rectangle 的對象,也可能是其它的 Shape 接口的派生類對象,比如 Circle 等等,簡單的說 drawNow() 的參數(shù)類型是無法預(yù)知的,$shape->draw() 的行為最終由傳入的參數(shù)的具體類型來決定,比如如果傳入 Triangle 的對象,那么就調(diào)用 Triangle 的 draw() 方法,如果傳入 Rectangle 的對象,就調(diào)用 Rectangle 的 draw() 方法。這種在運(yùn)行時刻根據(jù)傳遞的對象參數(shù)的類型來決定調(diào)用哪一個對象的方法的行為就可以稱之為多態(tài)。
Shape 也可以是一個抽象基類或者是非抽象的基類,上面的論述都是成立的。區(qū)別在于接口僅定義一套實(shí)現(xiàn)類必須遵守的規(guī)則,而使用基類則可以為派生類提供一些缺省的行為。
參考代碼如下:
/**
* Shape Interface
*
* @version 1.0
* @copyright
*/
interface Shape {
public function draw();
}
/**
* Triangle
*
* @uses Shape
* @version 1.0
* @copyright
*/
class Triangle implements Shape {
public function draw() {
print "Triangle::draw()\n";
}
}
/**
* Rectangle
*
* @uses Shape
* @version 1.0
* @copyright
*/
class Rectangle implements Shape {
public function draw() {
print "Rectangle::draw()\n";
}
}
/**
* Test Polymorphism
*
* @version 1.0
* @copyright
*/
class TestPoly {
public function drawNow(Shape $shape) {
$shape->draw();
}
}
$test = new TestPoly();
$test->drawNow(new Triangle());
$test->drawNow(new Rectangle());
/* vim: set expandtab tabstop=4 shiftwidth=4: */
什么是動態(tài)綁定?
HaoHappy 翻譯的 PHP5 Object Pattern 第九節(jié)中有介紹:
除了限制訪問,訪問方式也決定哪個方法將被子類調(diào)用或哪個屬性將被子類訪問。 函數(shù)調(diào)用與函數(shù)本身的關(guān)聯(lián),以及成員訪問與變量內(nèi)存地址間的關(guān)系,稱為綁定。
另有的說法:
綁定(binding):將方法的調(diào)用連到方法本身被稱為綁定,當(dāng)綁定發(fā)生在編譯期,被稱做靜態(tài)綁定,而在程序運(yùn)行的時候根據(jù)對象的類型來決定該綁定方法的成為動態(tài)綁定。
PHP 是一種動態(tài)語言,使用動態(tài)綁定。無須考慮采取何種綁定策略,因?yàn)橐黄鸲际亲詣拥摹?/p>
- 理解和運(yùn)用PHP中的多態(tài)性[譯]
- php學(xué)習(xí)筆記 面向?qū)ο笾衃接口]與[多態(tài)性]的應(yīng)用
- PHP面向?qū)ο蠖鄳B(tài)性實(shí)現(xiàn)方法簡單示例
- PHP面向?qū)ο蟪绦蛟O(shè)計之接口用法
- PHP面向?qū)ο蟪绦蛟O(shè)計之命名空間與自動加載類詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計類的定義與用法簡單示例
- PHP面向?qū)ο蟪绦蛟O(shè)計OOP繼承用法入門示例
- PHP面向?qū)ο蟪绦蛟O(shè)計之類與反射API詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計之多態(tài)性的應(yīng)用示例
相關(guān)文章
PHP表單驗(yàn)證的3個函數(shù)ISSET()、empty()、is_numeric()的使用方法
PHP表單驗(yàn)證的3個函數(shù)ISSET()、empty()、is_numeric()的使用方法分享,學(xué)習(xí)php的朋友可以參考下。2011-08-08php定時計劃任務(wù)的實(shí)現(xiàn)方法詳解
本篇文章是對php定時計劃任務(wù)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06解析array splice的移除數(shù)組中指定鍵的值,返回一個新的數(shù)組
array_splice這個數(shù)組函數(shù)在w3school的解釋是把數(shù)組中的一部分去掉并用其它值取代。所以我在做數(shù)組移除的時候沒有考慮到用這個函數(shù),或者因?yàn)閺膩頉]有用過2013-07-07PHP獲取當(dāng)前頁面URL函數(shù)實(shí)例
這篇文章主要介紹了PHP獲取當(dāng)前頁面URL函數(shù)實(shí)例,講述了一個非常簡單實(shí)用的獲取當(dāng)前頁面URL的函數(shù),并附帶說明了server參數(shù)的用法,需要的朋友可以參考下2014-10-10php站內(nèi)搜索并高亮顯示關(guān)鍵字的實(shí)現(xiàn)代碼
將sql語句中包含的%$info%交給DBMS執(zhí)行的時候,他會查找字段中含有變量$info的值的信息2011-12-12php.ini中的request_order推薦設(shè)置
這篇文章主要介紹了php.ini中的request_order推薦設(shè)置,需要的朋友可以參考下2015-05-05