溫馨提示×

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

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

PHP中如何實(shí)現(xiàn)重載

發(fā)布時(shí)間:2021-06-22 15:02:42 來(lái)源:億速云 閱讀:133 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)PHP中如何實(shí)現(xiàn)重載,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

php是弱類(lèi)型語(yǔ)言,并沒(méi)有像JAVA這種強(qiáng)類(lèi)型語(yǔ)言一樣有重載。

重載一般來(lái)說(shuō)就是擁有相同的函數(shù)名或方法名,但是參數(shù)列表卻不同(包括參數(shù)個(gè)數(shù)和參數(shù)類(lèi)型)

從這個(gè)定義來(lái)說(shuō),php是沒(méi)有重載的,因?yàn)閜hp不允許存在相同的函數(shù)名。

但是沒(méi)有并不意味著不能實(shí)現(xiàn)。

php有四種機(jī)制可以實(shí)現(xiàn)重載:(下面用java進(jìn)行對(duì)比)

1. 弱類(lèi)型,無(wú)需定義變量類(lèi)型

先舉一個(gè)JAVA重載的例子:

class demo
{
  public static void main (String[] args)
  {
    sum(1,1);//2
    sum(1,1.5);//2.5
    sum(1.5,1.5);//3.0
  }
  public static void sum(int var1,int var2){
      System.out.println(var1+var2);
  }
  public static void sum(int var1,double var2){
      System.out.println(var1+var2);
  }
  public static void sum(double var1,double var2){
      System.out.println(var1+var2);
  }
}

上面的代碼如果用php語(yǔ)言實(shí)現(xiàn):

<?php
function sum($var1,$var2){
  echo $var1+$var2;
}
sum(1,1);//2
sum(1,1.5);//2.5
sum(1.5,1.5);//3
?>

2. 可選參數(shù),允許變量設(shè)置默認(rèn)值

JAVA重載例子:

class demo
{
  public static void main (String[] args)
  {
    sum(1,2);//3
    sum(1,2,3);//6
  }
  public static void sum(int var1,int var2){
      System.out.println(var1+var2);
  }
  public static void sum(int var1,int var2,int var3){
      System.out.println(var1+var2+var3);
  }
}

用php可選參數(shù)特性實(shí)現(xiàn):

<?php
function sum($var1,$var2,$var3=NULL){//$var3設(shè)置默認(rèn)值
  echo $var1+$var2+$var3;
}
sum(1,2);//2
sum(1,2,3);//2.5
?>

可以看到同樣的功能,但是php這種弱類(lèi)型語(yǔ)言實(shí)現(xiàn)起來(lái)更簡(jiǎn)單

3. 可變參數(shù)

主要用到以下兩個(gè)函數(shù):

func_num_args() 返回函數(shù)的參數(shù)個(gè)數(shù)
func_get_args() 返回一個(gè)包含函數(shù)參數(shù)列表的數(shù)組

具體實(shí)現(xiàn)方式:

<?php
class demo{
  public function method(){
    $numargs = func_num_args();//獲得參數(shù)數(shù)量
    $args = func_get_args();//獲得參數(shù)數(shù)組
    switch ($numargs) {//通過(guò)變量個(gè)數(shù)來(lái)確定調(diào)用哪個(gè)方法
      case 2:
        $this->method2($args[0],$args[1]);
        break;
      case 3:
        $this->method3($args[0],$args[1],$args[2]);
        break;
    }
  }
  private function method2($var1,$var2){
    #code...
  }
  private function method3($var1,$var2,$var3){
    #code...
  }
}
//調(diào)用
$obj = new demo();
$obj->method('var1','var2');
$obj->method('var1','var2','var3');
//看起來(lái)似乎通過(guò)一個(gè)接口調(diào)用
//但其實(shí)內(nèi)部已經(jīng)調(diào)用了各自定義的方法
?>

4. 使用魔術(shù)方法 __call()

public mixed __call ( string $name , array $arguments )

在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)的方法時(shí),__call()會(huì)被自動(dòng)調(diào)用

$name參數(shù)是要調(diào)用的方法名稱(chēng) $argument參數(shù)是被調(diào)用方法的參數(shù)數(shù)組

具體實(shí)現(xiàn)方式類(lèi)似上面的第三要點(diǎn):

<?php
class demo{
  public function __call($name,$arguments){
    if($name == "method"){
      switch (count($arguments)) {//獲得參數(shù)數(shù)組個(gè)數(shù)
        case 2:
          $this->method2($args[0],$args[1]);
          break;
        case 3:
          $this->method3($args[0],$args[1],$args[2]);
          break;
      }
    }
  }
  private function method2($var1,$var2){
    #code...
  }
  private function method3($var1,$var2,$var3){
    #code...
  }
}
//調(diào)用
$obj = new demo();
$obj->method("var1","var2");
$obj->method("var1","var2","var3");
?>

關(guān)于“PHP中如何實(shí)現(xiàn)重載”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

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

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

php
AI