PHP多態與動態綁定

來源:互聯網
上載者:User
本文主要介紹了PHP多態與動態綁定,講解了什麼是多態性和什麼是動態綁定,以及多態與動態綁定的執行個體。希望對大家有所協助。

什麼是多態性?

多態性是繼資料抽象和繼承後,物件導向語言的第三個特徵。從字面上理解,多態的意思是“多種形態”,簡單來說,多態是具有表現多種形態的能力的特徵,在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):將方法的調用連到方法本身被稱為綁定,當綁定發生在編譯期,被稱做靜態繫結,而在程式啟動並執行時候根據對象的類型來決定該Binder 方法的成為動態綁定。

PHP 是一種動態語言,使用動態綁定。無須考慮採取何種繫結原則,因為一起都是自動的。


相關推薦:

PHP 物件導向 final類與final方法

PHP 單例模式實現

PHP 原廠模式使用方法_PHP教程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.