php多態的使用簡例(php用哪幾種形式實現多態)

本文目錄一覽:

為啥PHP的多態是假多態?

1.多態是指在面向對象中能夠根據使用類的上下文來重新定義或改變類的性質和行為。

2.PHP不支持重載實現多態,但是PHP可以變向的實現多態效果。

3.php其語法特點,不支持固定變量類型,它是根據上下文來確定當前的類型是什麼,即,最後一次賦值是什麼類型,現在它就是什麼類型。也就不存在將子類

變量賦給基類變量的說法。但php函數的參數,是可以規定類型的,如下面的show函數。如果傳遞一個不是此類型的參數,將會在運行時報錯。

代碼如下:

?php

 

/**

 * 虛基類

 */

abstract class T{

    abstract function show();

}

 

/**

 * 子類

 */

class T1 extends T {

    public function show(){

        echo “T1 from abstract class!br/”;

    }

    public function show1(){

        echo “T1 not from abstract class!br/”;

    }

}

 

/**

 * 子類

 */

class T2 extends T {

    public function show(){

        echo “T2 from abstract class!br/”;

    }

    public function show1(){

        echo “T2 not from abstract class!br/”;

    }

}

 

class T3 {

    public function show(){

        echo “in T3!br/”;

    }

    public function show1(){

        echo “in T3!br/”;

    }

}

 

$t1 = new T1();

$t2 = new T2();

$t3 = new T3();

 

show($t1);

show($t2);

 

//報錯,$t3不是T,所以被show函數調用的時候,會報類型不對的錯誤

//show($t3);

 

function show( T $t ){//注意參數的類型

    $t-show();

    $t-show1();

}

?

php中什麼是多態?

多態就是同一個行為,作用不同的對象返回的結果不一樣,這個用處挺大的

PHP多態代碼實例

這篇文章主要介紹了PHP多態代碼實例,本文用2個代碼實例來演示PHP中的多態,需要的朋友可以參考下

多態定義:只關心一個接口或者基類,而不關心一個對象的具體類。(同一類型,不同結果)

這裡兩個例子:

第一個,我們發現,基類定義了標準,子類進行了自我規則的實現。這是多態的一個要求。同時,這是滿足重寫;實際上這是不同類的不同表現;沒有嚴格滿足一個接口,或者基類編程。因為你調用的時候不是

stu-showGrade()

而是各自自己的方法;

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

class

stu{

public

function

showGrade(){

echo

base

class;

}

}

class

xiaomin

extends

stu{

public

function

showGrade(){

echo

is

son

show

80;

}

}

class

xiaoli

extends

stu{

public

function

showGrade(){

echo

is

son

show

60;

}

}

function

doit($obj){

if(get_class($obj)

!=

stu){

$obj-showGrade();

}

}

doit(new

xiaoli());

doit(new

xiaomin());

第二個例子:dovoice

參數規定了$obj

為animal,意識就是用接口

接受了

實現類對象。了向上轉型。這就符合同一類型,不同結果了,這就是多態;

實際上在Java中

會是

animal

a

=

new

dog();這樣子的;因為PHP

是若類型語言。沒有對象轉型機制。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

interface

animal{

public

function

voice();

}

class

cat

implements

animal{

public

function

voice(){

echo

miao~~~br;

}

}

class

dog

implements

animal{

public

function

voice(){

echo

wang

~~~br;

}

}

function

dovoice(animal

$obj){

$obj-voice();

}

dovoice(new

dog());

dovoice(new

cat());

PHP中多態如何實現

用trait,定義類,在被繼承的類中,use,定義的trait類。

ps:use,可以多個,就是php中簡單的多態的實現

要怎麼理解PHP中的多態

面向對象是什麼?你可以說出這個答案嗎(相信沒有正確答案)?我覺得面向對象只是軟件工程中的一種工具而已。那軟件工程的目的是什麼?目的是編寫出可靠、高效、靈活、易擴展、可復用的軟件產品。既然面向對象是軟件工程當中的一種工具,那我們使用面向對象的目的也應該是這些。就是說我們用面向對象的目的是編寫出可靠、高效、靈活、易擴展、可復用的軟件產品。我們一定要以這個目的為中心來學習和使用面向對象,不然你會失去方向。大多時候講面向對象,多是講面向對象本身,而不講怎麼利用面向對象去解決實際的問題,這樣很容易誤導初學者。再加上華麗的文字,很多人覺得只要面向對象了,什麼事都可以OK了。舉個例子,給你一把最好的槍,教你如何使用它,過了一段時間你對這把槍了如指掌。現在讓你去打靶,結果100發子彈,一發都沒有打中。咦,我不是用了最好的槍了嗎?為什麼一發都打不中?因為你不知道射擊要領,不知道如何瞄準靶心,結果當然可想而知了。我們要OOP(Object-Oriented Programming),不要POO(Programming Object-Oriented)。

面向對象有3大特徵(一般講面向對象都會提到這三個),繼承、封裝、多態。按字面上理解,對我們來說是全新的概念,但只要你分析一下,就會發現這些都是我們在編程中,常常用到的概念。

封裝是什麼?只有在面向對象里才有封裝的概念嗎?不是的,只要是程序就有封裝。大家常常用的變量、函數就是封裝。舉個例子,你寫了取用戶狀態的函數,對調用這個函數的程序來說,取用戶狀態邏輯是封閉的,所以邏輯發生變化時,不會對調用的程序造成影響。變量也是封裝,你定義了一個int變量,無論你給它賦什麼值,對調用這個變量的程序來說,就是一個整數型類型的值。提到封裝不得不提接口,因為封裝是做接口的過程。接口是什麼?只有用了interface這個關鍵字才是接口嗎?詞典里的解釋是物體的接觸面、界面。世界是由物體組成的,所以我們的生活當中到處是接口。你看到一個球,它是圓的,圓就是接口。我們的程序也都是由接口組成的,數據類型、關鍵字、函數、變量等等。比如說看到int這個詞,你就知道它是整數型數據類型,我們可以說:int是整數型數據類型的接口。所以封裝和接口不是面向對象特有的概念,只不過在面向對象里它們的範圍擴大了而已。我們在網上常常能看到面向對象和面向過程之間的討論,說哪一個好。其實,這些都是不重要的,因為用哪一個方法,都是做接口的過程。關鍵在於使用這些方法的程序員,看你的抽象能力怎麼樣了。

多態可能是我們最難理解的一個概念,polymorphism這個詞,因為大家沒有學習過面向對象的話,是很難碰到的。其實這個也是我們常常用到的一個概念,只不過沒有給它命名而已(至少沒用多態來命名它)。看下面的例子, double a = 0,b=5,c=0;

a = 1;

c = a + b;

cout c endl;

a = 3.5f;

c = a + b;

cout c endl;

輸出結果是

6

8.5

我們先定義了三個變量,a、b、c,先後給A賦值1,3.5,然後輸出a+b的結果,可以看到,同樣的邏輯隨着a值的變化,輸出的結果也是不一樣的(多態的效果)。在這裡double是高類型(相當於父類),1、3.5(int,float)是低類型(相當於子類)。這個例子是變量的多態,那有沒有函數多態的例子,當然有,寫過C的人都知道函數指針,它就是函數的多態。

終於要說說對象了,重點就在這裡~ 第一,類是一個模塊。以前我們的模塊是一個文件,比如一個.c、.cpp等等。一個模塊文件里寫什麼功能函數沒有限制(理論上沒有明確定義該怎麼寫),按開發人員的經驗來部署這些功能函數。所以很容易寫出超級模塊(一個文件里有幾十個、幾百個函數),代碼維護起來很不方便。面向對象就很好的解決了這個問題,只要看過面向對象基礎理論的程序員都知道,先定義類,然後把相關的函數放到類里。面向對象里有一個原則,類單一職責原則,遵循這個原則的話,你可以寫出很好的模塊出來。更重要的是我們溝通維護起來也很方便,比如以前溝通可能是這樣的,修改customer.cpp文件里的某一個函數,面向對象里呢,可以這樣說修改客戶類的某一個方法。這個非常重要,因為這個跟人的思維有密切關係。比如我們到餐廳去吃飯,你對服務員說我要一瓶啤酒,我確信服務員會再問你一句:先生,你要什麼牌子的啤酒?但如果你說:我要一瓶百威啤酒,服務員肯定不會再問你。要是把一個系統看成生產線的話,類就是工人。一個工人只負責一個操作,A負責打孔,B負責裝螺絲釘,C負責包裝。這樣做非常有效率,而且出了問題,很好確定問題出現在哪個工人。第二,類是一個自定義數據類型。理解了這點,你的思路會清晰起來,也不會對面向對象感到陌生。看下面的簡單例子,

//計算兩個數的合

double sum(double a,double b);

int _tmain(int argc, _TCHAR* argv[])

{

double a=0,b=0;

a = 1;

b = 2;

cout sum(a,b) endl;

a = 1.2f;

b = 2.3f;

cout sum(a,b) endl;

return 0;

}

//計算兩個數的合

double sum(double a,double b)

{

return a+b;

}

例子里,低類型的int和float賦值給了高類型的double,然後用sum函數它們的合。如果編程語言不支持這種轉換的話,我們只好寫兩個函數了,

//處理int的計算

int sum(int a,int b);

//處理float的計算

float sum(float a,float b);

所以我們可以確定-同類型當中,只有提供從低到高類型的轉換,才可以實現多態的效果(不知道,沒有面向對象以前是什麼概念)。當然,類作為數據類型,也需要這種轉換了。但類是自定義類型,所以,哪個是高類型,哪個是低類型,必須要由我們來定義:父類是高類型、子類是低類型(繼承是這麼誕生的嗎:))。繼承讓我們可以復用父類的代碼,但在這個例子中我們可以看出,它的主要目的是在多態。

上面我們討論了面向對象和它的三個特徵,我們可以看到,這些都是編程當中常常用到的概念。我覺得最大的突破是給我們提供了新的思維模式、新的代碼組織結構、定義了以前軟件設計中比較模糊的概念(比如多態)。那我們怎麼轉換我們的思維呢?把你想象成公司的經理就可以了。你現在是一家公司的經理了,部門就是子系統,員工就是對象。你需要做的就是這些,

-每天會有很多事需要你處理,做好心裡準備。

-公司做什麼業務?

-要建立幾個部門?,規定部門之間的溝通規則。

-需要什麼樣的職位?每個職位要做的事是什麼?

-規定業務流程,業務流程中,需要哪個部門參與?需要哪個員工參與?他們之間怎麼溝通?

-借鑒成功的管理模式,但要符合公司的情況,不要盲目地使用,因為代價太大了。

-不要設置太多的溝通環節,能簡單就簡單,只要完成目標就可以。

-準備應對變化。世界上沒有對於錯,永遠是前進中不斷修正。

就這些啦?恩,道理很簡單,但要做一個好公司就非常困難了,因為變數太大了。面向對象也是一樣的,需要付出努力,才可以做好。

php 多態 有什麼用

多態性,其來自於dictionary.com的定義是”以不同形式,階段或者類型出現在獨立的組織中或者同種組織中,而不存在根本區別。”由該定義, 我們可以認為,多態性是一種通過多種狀態或階段來描述相同對象的編程方式。其實,它的真正意義在於:實際開發中,我們只需要關注一個接口或基類的編程,而 不必擔心一個對象所屬於的具體類(class)。

如果你熟悉設計模式,即使只是有個初步了解,那麼你也會了解這個概念。事實上,多態 性可能是基於模式設計編程中的最偉大的工具。它允許我們以一種邏輯的方式來組織相類似的對象從而實現在具體編碼時不必擔心對象的具體類型;而且,我們只需 要對一個所期望的接口或基類編程即可。一個應用程序越抽象,則它就顯得越靈活–而多態性是對行為加以抽象的最好的方式之一。

例如, 讓我們考慮一個叫Person的類。我們可以用稱為David,Charles和Alejandro的類來子類化Person。Person有一個抽象方 法AcceptFeedback(),所有的子類都要實現這個方法。這意味着,任何使用基類Person的子類的代碼都能調用方法 AcceptFeedback()。你不必檢查該對象是一個David還是一個Alejandro,僅知道它是一個Person就夠了。結果是,你的代碼 只需關注”最小公分母”-Person類即可。

在這個示例中的Person類也可以被創建為一個接口。當然,與上面相比存在一些區 別,主要在於:一個接口並沒有給出任何行為,而僅確定了一組規則。一個Person接口要求的是”你必須支持AddFeedback()方法”,而一個 Person類可以提供一些AddFeedback()方法的缺省代碼-你對之的理解可以是”如果你不選擇支持AddFeedback(),那麼你應該提 供一種缺省實現。”至於如何選擇接口或基類則並非本文的主題;但是,一般說來,你需要通過基類來實現一個缺省的方法。如果你能夠簡單地勾勒出你的類所要實 現的一組期望的功能,那麼你也可以使用一個接口。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/242510.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:49
下一篇 2024-12-12 12:49

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Python數據類型分為哪幾種

    Python作為一門非常靈活的編程語言,有着非常豐富的數據類型。Python的數據類型可以分為數字類型、字符串類型、列表類型、元組類型、字典類型和集合類型六種。 一、數字類型 Py…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台服務器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • JavaScript創建對象的幾種方式詳解

    JavaScript是一門用於在網頁上實現動態交互效果的編程語言,對於前端開發而言,掌握JavaScript創建對象的幾種方式是必備技能之一。在本文中,我們將從多個方面詳細闡述Ja…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24

發表回復

登錄後才能評論