PHP 中的方法過載

Subodh Poudel 2023年1月30日
  1. PHP 中的方法過載
  2. 使用 __call() 魔術方法在 PHP 中實現方法過載
  3. 在 PHP 中使用 __callStatic() 魔術方法實現方法過載
PHP 中的方法過載

本文將結合示例介紹 PHP 中方法過載的概念。

PHP 中的方法過載

方法過載是 OOP 中的一個概念,其中多個同名方法存在於一個接受不同數量的引數或資料型別的類中。例如,方法 add() 可以通過定義兩次來過載;第一個接受兩個引數,而第二個接受三個引數。

我們甚至可以通過在一種方法中提供整數引數同時在另一種方法中提供浮點引數來過載函式。這種型別的過載在 Java 和 C++ 等語言中很流行。

然而,方法過載的概念在 PHP 中是完全不同的。方法過載是藉助魔術方法動態建立方法的過程。

我們可以建立類範圍內不存在的方法。它適用於類方法和靜態方法。

魔術方法 __call()__callStatic() 用於過載動態方法。從名稱中可以清楚地看出,__call() 方法用於類方法,而 callStatic() 方法用於靜態方法。

這些方法的語法如下所示。

__call($name, $arguments){
//function  body
}

這裡,$name 是動態方法的名稱,$arguments 是一個包含動態方法引數的陣列。在方法內部,我們可以使用 $arguments 陣列中的索引來訪問引數。

使用 __call() 魔術方法在 PHP 中實現方法過載

我們可以使用 __call() 方法在 PHP 中動態建立一個方法。當我們呼叫尚未在物件上下文中建立的方法時,該方法將被執行。

該過程在 PHP 中稱為方法過載。

例如,在其中建立一個類 University 和方法 __call()。將此方法中的引數命名為 $name$arguments

在方法內部,列印 $name 變數和 $arguments 陣列的專案。在課堂之外,建立一個 University 類的物件 $student

接下來,使用 $student 物件呼叫 student_info() 方法。在方法中傳遞引數 001Biswash

示例程式碼:

<?php
class University{
    public function __call($name, $arguments){
        echo "inside the method: ".$name."<br>";
        echo "id:".$arguments[0]."<br>";
        echo "name:".$arguments[1]."<br>";
        }
}

$student = new University;
$student->student_info(001,'Biswash');
?>

讓我們瞭解上面示例的流程。

當我們使用引數呼叫 student_info() 方法時,程式在 University 類中找不到該方法。但是,類中存在方法 __call(),因此執行該函式。

方法中的 $name 引數包含 student_info() 方法,$arguments 引數將引數 001Biswash 儲存為 Array ( [0] => 1 [1] => Biswash )。引數列印在 __call() 方法中。

輸出:

inside the method: student_info
id:1
name:Biswash

這樣,我們就可以在 PHP 中使用 __call() 魔術方法來實現物件上下文中的方法過載。

在 PHP 中使用 __callStatic() 魔術方法實現方法過載

我們還可以在 PHP 的靜態上下文中使用方法過載功能。我們必須使用 __callStatic() 魔術方法。

該方法的函式定義類似於 __call 方法。但是,當我們在靜態上下文中使用它時,該方法應該是靜態的。

由於它是一個靜態上下文,我們不需要建立該類的例項。我們可以使用類中的::運算子直接呼叫要動態建立的方法。

例如,在類 University 中建立一個方法 __callStatic(),就像我們為 __call() 方法所做的那樣。不要忘記在定義方法時編寫 static 關鍵字。

按照上面的方法填寫方法的引數和主體。在類之外,使用類中的 :: 運算子呼叫方法 professor_info 作為 University::professor_info()

在方法中提供你選擇的引數。

示例程式碼:

<?php
class University{
    public static function __callStatic($name, $arguments){
        echo "inside the method: ".$name."<br>";
        echo "id:".$arguments[0]."<br>";
        echo "name:".$arguments[1]."<br>";
    }
}

University::professor_info(0010,'Professor Jack ');
?>

輸出:

inside the method: professor_info
id:8
name:Professor Jack

這樣,我們可以使用 PHP 的 __callStatic() 魔術方法過載靜態方法。

作者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn