作者:mobiledu2502912375 | 来源:互联网 | 2023-05-18 16:18
From:http:www.uh80.com?p371方法1:用__call()方法今天遇到一个头疼的问题,如何在PHP中实现方法重载(包括构造器重载).查阅了很多资料,直接重
From : http://www.uh80.com/?p=371
方法1:用__call()方法
今天遇到一个头疼的问题,如何在PHP中实现方法重载(包括构造器重载).查阅了很多资料,直接重载是无法实现的.但是可以通过__call()方法来变相实现.实际上这个方法我认为很差.是PHP开发者偷懒,才想出这么一个拐弯抹角的方法,而且用这个方法实现的重载程度非常有限,尤其是构造器重载,已经不是真正意义上的构造器。构造器在对象被创建时自动执行,一般不会显式的调用。而用__call()方法实现的构造器必须显示的调用,也就是说构造函数与普通函数的性质完全相同,只不过功能不同而已了。
下面是我写出的一个实例代码:
class OverloadTest{
public function __call($name,$para){
if($name==’construct’){
switch (count($para)){
case 0:
$this->cons1();
break;
case 1:
$this->cons2($para[0]);
break;
default:
print ”wrong para”;
}
}else{
print ’Undefined method ’.$name;
}
}
function cons1(){
echo ”cons1() called”;
}
function cons2($var){
echo ”cons2() called.”;
}
}
$foo = new OverloadTest();
$foo->construct();
$foo->construct(‘test’);
?>
定义了类OverloadTest,目的是使该类有两个构造器,一个是无参数的,一个是有一个参数的(普通method的重载与这个道理完全相同)。由于无法直接定义两个__construct()构造器,因此只好定义cons1()和cons2($var)两个普通方法,然后定义__call()方法,在__call()方法中判断调用的来源,如果是调用construct()函数,则根据参数的个数情况分别转到不同的方法去执行。如参数个数为0时,转到cons1(),参数个数为1时,转到cons2()。还可以继续增加所支持的参数的个数,只需要在switch—case 语句中增加即可。另外如果有足够的精力,还可以通过使用is_int()等函数来判断参数的类型,进而可以根据不同的参数类型调用不同的方法。
细节代码不再赘述,有问题的可以到群中讨论。
——————————————-
方法2:用func_get_args()和func_num_args()函数
func_get_args()和func_num_args()函数以前没大用过。今天受phpdream朋友的启发,研究了一下这两个函数的功能,发现可以很好的解决方法重载的参数传递问题。尤其是采用这种方法后,构造器的问题得到了较好的解决,可以不必显式的调用构造器,这一点非常不错。普通的方法重载,也可以用这个方法很好的实现。
一个完整的实例如下:(以构造器重载为例)
class OverloadTest{
function __construct(){
$arr=func_get_args();
switch(func_num_args()){
case 1:
$this->cons1($arr[0]);
break;
case 2:
$this->cons2($arr[0],$arr[1]);
break;
}
}
function cons1($var){
echo ”cons1(“.$var.”) called.”;
}
function cons2($var1,$var2){
echo ”cons2(“.$var1.”,”.$var2.”) called.”;
}
}
$foo = new OverloadTest(‘x’);
$foo2 = new OverloadTest(‘x’,”y”);
?>
根据我的实验,这种情况下有可能出现PHP警告,原因是参数个数不匹配,但是我在PHP5+APACHE2下测试,打开所有的error_reporting,仍然没有任何警告信息。但是为了保险起见,我建议在调用重载的方法前在语句前加“@”,来防止出现警告信息。如本例中,可以这样:
@$foo = new OverloadTest(‘x’);
@$foo2 = new OverloadTest(‘x’,”y”);
如果是调用普通方法
@$var=method1();
@$var2=method1(‘xyz’);
根据自己的需要可以对代码进行修改,以满足不同参数个数的需要。
个人认为后一种方法还是比较不错的。