PHP实现重载的常用方法实例详解

这篇文章主要介绍了PHP实现重载的常用方法,结合实例形式对比java分析了php实现重载的四种常见实现技巧,需要的朋友可以参考下。

本文实例讲述了PHP实现重载的常用方法,分享给大家供大家参考,具体如下:

php是弱类型语言,并没有像JAVA这种强类型语言一样有重载。

重载一般来说就是拥有相同的函数名或方法名,但是参数列表却不同(包括参数个数和参数类型)

从这个定义来说,php是没有重载的,因为php不允许存在相同的函数名。

但是没有并不意味着不能实现。

php有四种机制可以实现重载:(下面用java进行对比)

1. 弱类型,无需定义变量类型

先举一个JAVA重载的例子:

  1. class demo
  2. {
  3. public static void main (String[] args)
  4. {
  5. sum(1,1);//2
  6. sum(1,1.5);//2.5
  7. sum(1.5,1.5);//3.0
  8. }
  9. public static void sum(int var1,int var2){
  10. System.out.println(var1+var2);
  11. }
  12. public static void sum(int var1,double var2){
  13. System.out.println(var1+var2);
  14. }
  15. public static void sum(double var1,double var2){
  16. System.out.println(var1+var2);
  17. }
  18. }

上面的代码如果用php语言实现:

  1. <?php
  2. function sum($var1,$var2){
  3. echo $var1+$var2;
  4. }
  5. sum(1,1);//2
  6. sum(1,1.5);//2.5
  7. sum(1.5,1.5);//3
  8. ?>

2. 可选参数,允许变量设置默认值

JAVA重载例子:

  1. class demo
  2. {
  3. public static void main (String[] args)
  4. {
  5. sum(1,2);//3
  6. sum(1,2,3);//6
  7. }
  8. public static void sum(int var1,int var2){
  9. System.out.println(var1+var2);
  10. }
  11. public static void sum(int var1,int var2,int var3){
  12. System.out.println(var1+var2+var3);
  13. }
  14. }

用php可选参数特性实现:

  1. <?php
  2. function sum($var1,$var2,$var3=NULL){//$var3设置默认值
  3. echo $var1+$var2+$var3;
  4. }
  5. sum(1,2);//2
  6. sum(1,2,3);//2.5
  7. ?>

可以看到同样的功能,但是php这种弱类型语言实现起来更简单

3. 可变参数

主要用到以下两个函数:

func_num_args() 返回函数的参数个数

func_get_args() 返回一个包含函数参数列表的数组

具体实现方式:

  1. <?php
  2. class demo{
  3. public function method(){
  4. $numargs = func_num_args();//获得参数数量
  5. $args = func_get_args();//获得参数数组
  6. switch ($numargs) {//通过变量个数来确定调用哪个方法
  7. case 2:
  8. $this->method2($args[0],$args[1]);
  9. break;
  10. case 3:
  11. $this->method3($args[0],$args[1],$args[2]);
  12. break;
  13. }
  14. }
  15. private function method2($var1,$var2){
  16. #code...
  17. }
  18. private function method3($var1,$var2,$var3){
  19. #code...
  20. }
  21. }
  22. //调用
  23. $obj = new demo();
  24. $obj->method('var1','var2');
  25. $obj->method('var1','var2','var3');
  26. //看起来似乎通过一个接口调用
  27. //但其实内部已经调用了各自定义的方法
  28. ?>

4. 使用魔术方法 __call()

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

在对象中调用一个不可访问的方法时,__call()会被自动调用

$name参数是要调用的方法名称 $argument参数是被调用方法的参数数组

具体实现方式类似上面的第三要点:

  1. <?php
  2. class demo{
  3. public function __call($name,$arguments){
  4. if($name == "method"){
  5. switch (count($arguments)) {//获得参数数组个数
  6. case 2:
  7. $this->method2($args[0],$args[1]);
  8. break;
  9. case 3:
  10. $this->method3($args[0],$args[1],$args[2]);
  11. break;
  12. }
  13. }
  14. }
  15. private function method2($var1,$var2){
  16. #code...
  17. }
  18. private function method3($var1,$var2,$var3){
  19. #code...
  20. }
  21. }
  22. //调用
  23. $obj = new demo();
  24. $obj->method("var1","var2");
  25. $obj->method("var1","var2","var3");
  26. ?>