本文实例讲述了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