php多态包括重写和重载,PHP-PHP重载和多态的实现?

1.重载的实现:

方法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');

2.多态的实现:

PHP 5.x 虽然支持抽象类和接口, 但并不支持多态,那如何实现多态呢?可以借助接口来实现。

1. 建立 ITest.php 接口

interface ITest{

public function test($a, $b);

}

2. 建立 TestLibary 文件夹, 在这个文件夹下定义的所有类都实现 ITest 接口, 以下是一些例子。

PerformanceTest.php

class PerformanceTest implements ITest

{

public function __construct()

{

//构造方法

}

public function test($a, $b)

{

//接口方法的实现

echo '我是 PerformanceTest 类';

}

}

DataTest.php

class DataTest implements ITest

{

public function __construct()

{

//构造方法

}

public function test($a, $b)

{

//接口方法的实现

echo '我是 DataTest 类';

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值