本文实例讲述了PHP实现重载的常用方法。分享给大家供大家参考,具体如下:
php是弱类型语言,并没有像JAVA这种强类型语言一样有重载。
重载一般来说就是拥有相同的函数名或方法名,但是参数列表却不同(包括参数个数和参数类型)
从这个定义来说,php是没有重载的,因为php不允许存在相同的函数名。
但是没有并不意味着不能实现。
php有四种机制可以实现重载:(下面用java进行对比)
1. 弱类型,无需定义变量类型
先举一个JAVA重载的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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语言实现:
1
2
3
4
5
6
7
8
|
<?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. 可选参数,允许变量设置默认值
JAVA重载例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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可选参数特性实现:
1
2
3
4
5
6
7
|
<?php function sum( $var1 , $var2 , $var3 =NULL){ //$var3设置默认值 echo $var1 + $var2 + $var3 ; } sum(1,2); //2 sum(1,2,3); //2.5 ?> |
可以看到同样的功能,但是php这种弱类型语言实现起来更简单
3. 可变参数
主要用到以下两个函数:
func_num_args()
返回函数的参数个数
func_get_args()
返回一个包含函数参数列表的数组
具体实现方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php class demo{ public function method(){ $numargs = func_num_args(); //获得参数数量 $args = func_get_args(); //获得参数数组 switch ( $numargs ) { //通过变量个数来确定调用哪个方法 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... } } //调用 $obj = new demo(); $obj ->method( 'var1' , 'var2' ); $obj ->method( 'var1' , 'var2' , 'var3' ); //看起来似乎通过一个接口调用 //但其实内部已经调用了各自定义的方法 ?> |
4. 使用魔术方法 __call()
public mixed __call ( string $name , array $arguments )
在对象中调用一个不可访问的方法时,__call()
会被自动调用
$name参数是要调用的方法名称 $argument参数是被调用方法的参数数组
具体实现方式类似上面的第三要点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php class demo{ public function __call( $name , $arguments ){ if ( $name == "method" ){ switch ( count ( $arguments )) { //获得参数数组个数 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... } } //调用 $obj = new demo(); $obj ->method( "var1" , "var2" ); $obj ->method( "var1" , "var2" , "var3" ); ?> |
希望本文所述对大家PHP程序设计有所帮助。
原文链接:http://blog.csdn.net/whd526/article/details/70239791