什麼是多態性?
多態性是繼資料抽象化和繼承後,物件導向語言的第三個特徵。從字面上理解,多態的意思是“多種形態”,簡單來說,多態是具有表現多種形態的能力的特徵,在OO中是指“語言具有根據對象的類型以不同方式處理之,特別是重載方法和繼承類別這種形式」的能力。多態被認為是物件導向語言的必備特性。
例如:
我們建立一個介面Shape,定義一個空的方法draw(),那麼所有的實作類別都必須實作這個方法,假設Shape 有兩個實作類別:Triangle 和Rectangle,我們雖然無法透過類似這樣的Java 程式碼來詮釋PHP 的多態性:
程式碼如下:
Shape s = new Triangle(); s.draw();
不過PHP5.1 中引入了Type Hinting,可以限制函數(或方法)的參數類型,我們使用這個特性來示範PHP5 的多態性。
參考如下的程式碼:
class TestPolymorphism { public function drawNow(Shape $shape) { $shape->draw(); } }
函數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 第九節中有介紹:
除了限制訪問,訪問方式也決定哪個方法將被子類別呼叫或哪個屬性將被子類別存取。 函數呼叫與函數本身的關聯,以及成員存取與變數記憶體位址間的關係,稱為綁定。
另有的說法:
綁定(binding):將方法的呼叫連到方法本身稱為綁定,當綁定發生在編譯期,被稱為靜態綁定定,而在程式運行的時候根據物件的類型來決定該綁定方法的成為動態綁定。
PHP 是一種動態語言,使用動態綁定。無須考慮採取何種綁定策略,因為一起都是自動的。
以上是php中多態性與動態綁定詳解介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!