本文目錄一覽:
- 1、為啥PHP的多態是假多態?
- 2、php 多態 有什麼用
- 3、PHP多態代碼實例
- 4、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 多態 有什麼用
多態性,其來自於dictionary.com的定義是”以不同形式,階段或者類型出現在獨立的組織中或者同種組織中,而不存在根本區別。”由該定義, 我們可以認為,多態性是一種通過多種狀態或階段來描述相同對象的編程方式。其實,它的真正意義在於:實際開發中,我們只需要關注一個介面或基類的編程,而 不必擔心一個對象所屬於的具體類(class)。
如果你熟悉設計模式,即使只是有個初步了解,那麼你也會了解這個概念。事實上,多態 性可能是基於模式設計編程中的最偉大的工具。它允許我們以一種邏輯的方式來組織相類似的對象從而實現在具體編碼時不必擔心對象的具體類型;而且,我們只需 要對一個所期望的介面或基類編程即可。一個應用程序越抽象,則它就顯得越靈活–而多態性是對行為加以抽象的最好的方式之一。
例如, 讓我們考慮一個叫Person的類。我們可以用稱為David,Charles和Alejandro的類來子類化Person。Person有一個抽象方 法AcceptFeedback(),所有的子類都要實現這個方法。這意味著,任何使用基類Person的子類的代碼都能調用方法 AcceptFeedback()。你不必檢查該對象是一個David還是一個Alejandro,僅知道它是一個Person就夠了。結果是,你的代碼 只需關注”最小公分母”-Person類即可。
在這個示例中的Person類也可以被創建為一個介面。當然,與上面相比存在一些區 別,主要在於:一個介面並沒有給出任何行為,而僅確定了一組規則。一個Person介面要求的是”你必須支持AddFeedback()方法”,而一個 Person類可以提供一些AddFeedback()方法的預設代碼-你對之的理解可以是”如果你不選擇支持AddFeedback(),那麼你應該提 供一種預設實現。”至於如何選擇介面或基類則並非本文的主題;但是,一般說來,你需要通過基類來實現一個預設的方法。如果你能夠簡單地勾勒出你的類所要實 現的一組期望的功能,那麼你也可以使用一個介面。
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中簡單的多態的實現
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297196.html