溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP5多態(tài)性與動態(tài)綁定的介紹

發(fā)布時間:2021-09-02 10:11:12 來源:億速云 閱讀:149 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“PHP5多態(tài)性與動態(tài)綁定的介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“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)性:

復(fù)制代碼 代碼如下:


Shape s = new Triangle();
s.draw();


不過 PHP5.1 中引入了 Type Hinting,可以限制函數(shù)(或者方法)的參數(shù)類型,我們使用這個特性來演示 PHP5 的多態(tài)性。

參考如下的代碼:

復(fù)制代碼 代碼如下:


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ī)則,而使用基類則可以為派生類提供一些缺省的行為。

參考代碼如下:

復(fù)制代碼 代碼如下:


/**
 * 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)綁定。無須考慮采取何種綁定策略,因為一起都是自動的。

到此,相信大家對“PHP5多態(tài)性與動態(tài)綁定的介紹”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI