導航:首頁 > 編程語言 > php重載和重寫

php重載和重寫

發布時間:2022-08-21 08:27:52

php怎麼重載已經存在的方法

PHP不支持重載,但是可以利用靈活性模擬java的重載,另外PHP是支持重寫的。
模擬重載的例子我寫了個,你參考一下
function overloadTest(){
$name = "overload".func_num_args();
$name();
}
function overload0(){
echo 'overload0';
}
function overload1(){
echo 'overload1';
}
function overload2(){
echo 'overload2';
}
overloadTest(); //overload0
overloadTest(1); //overload1
overloadTest(1,1); //overload2

希望對你有幫助!

⑵ PHP面向對象,方法重寫的問題

PHP面向對象中方法是不能重載的,
所謂的的方法重載就是:定義相同的方法名. 通過「參數個數」不同或者"參數的類型"不同,來訪問相同方法名的不同方法。
所以你這種屬於:通過「參數個數」不同,所以PHP中是不允許的。

完全可以採用 抽象類+類實現的方式實現多種不同情況的對象類。

⑶ 什麼是PHP面向對象中的重載重寫

封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的介面訪問其他對象。

重載是一個類裡面多態性的體現

重寫是父類和子類多態性的體現

⑷ php重載與重寫,這里有兩幅圖,求細說

第二個感覺好奇怪

第二個不算重載吧?

⑸ 重載與重寫區別

您寫的是方法的重載。
class Bar extends Foo{
/*
void kk(){
}
這個方法是從Foo這個類里繼承而來
*/
void kk(String x){
}
}
因此bar類裡面有兩個方法同名,但是參數類型不一樣。
如果
class Bar extends Foo{
/*
void kk(){
}
這個方法是從Foo這個類里繼承而來
*/
void kk(){
}
}
這樣的話,就是方法的重寫,你可以在kk方法裡面寫您需要的方法。
下面是的一點,您仔細看看
1, 重載(Overloading)
(1) 方法重載是讓類以統一的方式處理不同類型數據的一種手段。多個同名函數同時
存在,具有不同的參數個數/類型。重載Overloading是一個類中多態性的一種表現。
(2) Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,但具
有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型
來決定具體使用哪個方法, 這就是多態性。
(3) 重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同
也可以不相同。無法以返回型別作為重載函數的區分標准。
下面是重載的例子:
package c04.answer;//這是包名
//這是這個程序的第一種編程方法,在main方法中先創建一個Dog類實例,然後在Dog
類的構造方法中利用this關鍵字調用不同的bark方法。不同的重載方法bark是根據其參
數類型的不同而區分的。

//注意:除構造器以外,編譯器禁止在其他任何地方中調用構造器。
package c04.answer;

public class Dog {
Dog()
{
this.bark();
}
void bark()//bark()方法是重載方法
{
System.out.println("no barking!");
this.bark("female", 3.4);
}
void bark(String m,double l)//注意:重載的方法的返回值都是一樣的,
{
System.out.println("a barking dog!");
this.bark(5, "China");
}
void bark(int a,String n)//不能以返回值區分重載方法,而只能以「參數類型」和「類名」來區分
{
System.out.println("a howling dog");
}

public static void main(String[] args)
{
Dog dog = new Dog();
//dog.bark();
//dog.bark("male", "yellow");
//dog.bark(5, "China");

2, 重寫(Overriding)
(1) 父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某

方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。在Java中,
子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不
動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又
稱方法覆蓋。
(2) 若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,
則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵
字引用了當前類的父類。
(3) 子類函數的訪問修飾許可權不能少於父類的;
下面是重寫的例子:
public class Base
{
void test(int i)
{
System.out.print(i);
}
void test(byte b)
{
System.out.print(b);
}
}
public class TestOverriding extends Base
{
void test(int i)
{
i++;
System.out.println(i);
}
public static void main(String[]agrs)
{
Base b=new TestOverriding();
b.test(0)
b.test((byte)0)
}
}
這時的輸出結果是1 0,這是運行時動態綁定的結果。

概念:即調用對象方法的機制。

動態綁定的內幕:

1、編譯器檢查對象聲明的類型和方法名,從而獲取所有候選方法。試著把上例Base
類的test注釋掉,這時再編譯就無法通過。

2、重載決策:編譯器檢查方法調用的參數類型,從上述候選方法選出唯一的那一個
(其間會有隱含類型轉化)。如果編譯器找到多於一個或者沒找到,此時編譯器就會
報錯。試著把上例Base類的test(byte b)注釋掉,這時運行結果是1 1。

3、若方法類型為priavte static final ,java採用靜態編譯,編譯器會准確知道該調用哪
個方法。

4、當程序運行並且使用動態綁定來調用一個方法時,那麼虛擬機必須調用對象的實
際類型相匹配的方法版本。在例子中,b所指向的實際類型是TestOverriding,所以
b.test(0)調用子類的test。但是,子類並沒有重寫test(byte b),所以b.test((byte)0)調用
的是父類的test(byte b)。如果把父類的(byte b)注釋掉,則通過第二步隱含類型轉化為
int,最終調用的是子類的test(int i)。

總結:重載和重寫(覆蓋)。

方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫
Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性
的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法
被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而
言,父類中的定義如同被「屏蔽」了,而且如果子類的方法名和參數類型和個數都和
父類相同,那麼子類的返回值類型必須和父類的相同;如果在一個類中定義了多個同
名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載
(Overloading)。Overloaded的方法是可以改變返回值的類型。也就是說,重載的返回
值類型可以相同也可以不同。

⑹ php 到底可不可以重載

php 作為一種弱類型語言,本身不能像強類型如java ,c++那樣,直接的實現重載。不過可以通過一些方法,間接的實現重載。

  1. 使用一個統一的函數來實現重載。該方法要使用func_get_args()和func_num_args()方法。

<?php

functiontest1($name){
echo$name;
}

functiontest2($name,$age){
echo$name.$age;
}

functionload(){
//返回輸入的元素數目
$num=func_num_args();
//返回輸入元素列表的數組形式
$arr=func_get_args();

if($num==1){
test1($arr[0]);
}else{
test2($arr[0],$arr[1]);
}
}

load("a");
echo"<br/>";
load("a","b");
?>


2.當對象試著調用不存在或者受許可權限制的方法時,__call()方法會被自動調用,從而可以實現類型重載的效果。該方法是php5新增的方法。

<?php
classA{
//name:調用的方法名字。args:參數列表
function__call($name,$args){
$num=count($args);
if($num==1){
$this->test1($args[0]);
}
else{
$this->test2($args[0],$args[1]);
}
}

functiontest1($name){
echo$name;
}
functiontest2($name,$age){
echo$name."".$age;
}
}

$a=newA();
$a->a("a");
echo"<br/>";
$a->a("a","b");

?>

⑺ 重載和重寫有什麼區別

重載和重寫的區別有以下幾點:

一、定義上的區別:

1、重載是指不同的函數使用相同的函數名,但是函數的參數個數或類型不同。調用的時候根據函數的參數來區別不同的函數。

2、覆蓋(也叫重寫)是指在派生類中重新對基類中的虛函數(注意是虛函數)重新實現。即函數名和參數都一樣,只是函數的實現體不一樣。

二、規則上的不同:

1、重載的規則:

①必須具有不同的參數列表。

②可以有不同的訪問修飾符。

③可以拋出不同的異常。

2、重寫方法的規則:

①參數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是重載。

②返回的類型必須一直與被重寫的方法的返回類型相同,否則不能稱其為重寫而是重載。

③訪問修飾符的限制一定要大於被重寫方法的訪問修飾符。

④重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常。

三、類的關繫上的區別:

重寫是子類和父類之間的關系,是垂直關系;重載是同一個類中方法之間的關系,是水平關系。

⑻ 重載和重寫有什麼區別

重載: 發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。

重寫: 發生在父子類中,方法名、參數列表必須相同,返回值范圍小於等於父類,拋出的異常范圍小於等於父類,訪問修飾符范圍大於等於父類;如果父類方法訪問修飾符為 private 則子類就不能重寫該方法。


閱讀全文

與php重載和重寫相關的資料

熱點內容
度人經pdf 瀏覽:898
怎麼配置android遠程伺服器地址 瀏覽:956
java程序員看哪些書 瀏覽:939
什麼app可以免費和外國人聊天 瀏覽:793
pdf手寫筆 瀏覽:178
別永遠傷在童年pdf 瀏覽:986
愛上北斗星男友在哪個app上看 瀏覽:419
主力散戶派發源碼 瀏覽:669
linux如何修復伺服器時間 瀏覽:59
榮縣優途網約車app叫什麼 瀏覽:477
百姓網app截圖是什麼意思 瀏覽:226
php如何嵌入html 瀏覽:813
解壓專家怎麼傳輸 瀏覽:745
如何共享伺服器的網路連接 瀏覽:134
程序員簡易表白代碼 瀏覽:168
什麼是無線加密狗 瀏覽:64
國家反詐中心app為什麼會彈出 瀏覽:69
cad壓縮圖列印 瀏覽:104
網頁打開速度與伺服器有什麼關系 瀏覽:865
android開發技術文檔 瀏覽:65