PHP5多態性與動態綁定方法
多態性是繼數據抽象和繼承後,面嚮對象語言的第三個特徵。從字面上理解,多態的意思是「多種形態」,簡單來講,多態是具備表現多種形態的能力的特徵,在OO中是指「語言具備根據對象的類型以不一樣方式處理之,特別是重載方法和繼承類這種形式」的能力。多態被認爲是面嚮對象語言的必備特性。vim
例如:app
建立一個接口 Shape,定義一個空的方法 draw(),那麼全部的實現類都必須實現這個方法,假設 Shape 有兩個實現類:Triangle 和 Rectangle,咱們雖然沒法經過相似這樣的 Java 代碼來詮釋 PHP 的多態性:
ide
Shape s = new Triangle();
函數
s.draw();
.net
class TestPolymorphism {
翻譯
public function drawNow(Shape $shape) {
$shape->draw();
}
}//codego.net
code
函數 drawNow() 中限制傳入的參數類型必須爲 Shape 接口派生類的對象,這裏咱們傳遞給 drawNow() 的參數多是 Triangle 或者 Rectangle 的對象,也多是其它的 Shape 接口的派生類對象,好比 Circle 等等,簡單的說 drawNow() 的參數類型是沒法預知的,$shape->draw() 的行爲最終由傳入的參數的具體類型來決定,好比若是傳入 Triangle 的對象,那麼就調用 Triangle 的 draw() 方法,若是傳入 Rectangle 的對象,就調用 Rectangle 的 draw() 方法。這種在運行時刻根據傳遞的對象參數的類型來決定調用哪個對象的方法的行爲就能夠稱之爲多態。對象
Shape 也能夠是一個抽象基類或者是非抽象的基類,上面的論述都是成立的。區別在於接口僅定義一套實現類必須遵照的規則,而使用基類則能夠爲派生類提供一些缺省的行爲。繼承
/**
* 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: */
接口
什麼是動態綁定?
HaoHappy 翻譯的 PHP5 Object Pattern 第九節中有介紹:
除了限制訪問,訪問方式也決定哪一個方法將被子類調用或哪一個屬性將被子類訪問。 函數調用與函數自己的關聯,以及成員訪問與變量內存地址間的關係,稱爲綁定。