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