7.4 复制对象
和普通变量一样,对象也可以通过赋值操作、传递函数参数等方式进行复制。
7.4.1 通过赋值复制对象
可以通过赋值操作复制对象,方法如下:
新对象名=原有对象名
【例7-15】 在例 7-14 的基础上,定义一个类 circle 的对象$mycircle,对其设置成员变量的值。然后再将其赋值到新的对象$newcircle中,代码如下:
$mycircle = new circle();
$mycircle->x = 100;
$mycircle->y = 100;
$mycircle->radius = 50;
$mycircle->color = "red";
//复制对象
$newcircle = $mycircle;
使用$newcircle对象调用draw()函数,输出结果如下:
Draw Cicle: Color red; (100, 100); Radius 50
可见$newcircle对象和$mycircle对象的内容完全相同。
7.4.2 通过函数参数复制对象
可以在函数参数中使用对象,从而实现对象的复制。
【例7-16】 在例7-14中,定义一个函数drawCircle(),代码如下:
function drawCircle($circle) {
if($circle instanceof circle) {
$circle->draw();
}
}
因为在参数列表中并没有指定参数$circle的数据类型,为了防止在调用函数draw()时出现错误,程序中使用 instanceof 关键字判断变量$circle 是否是类 circle 的实例。如果是,则调用$circle->draw()函数。
执行下面的代码:
$mycircle = new circle();
$mycircle->x = 100;
$mycircle->y = 100;
$mycircle->radius = 50;
$mycircle->color = "red";
drawCircle($mycircle);
结果如下:
Draw Cicle: Color red; (100, 100); Radius 50
可以看到,对象$mycircle的内容已经复制到参数$circle中。
可以在参数列表中使用抽象类的对象,它可以接收所有从抽象类派生的子类对象。这样就不需要为每个子类都定义一个对应的函数了。
【例7-17】 定义一个函数drawShape(),代码如下:
function drawShape($shape) {
if($shape instanceof Shape) {
$shape->draw();
}
}
需要使用类Shape的子类对象作为参数,调用drawShape()函数。因为类Shape是抽象类,它的 draw()函数没有具体的实现代码。如果以 circle 对象或 line 对象作为参数,则可以执行circle->draw()函数或line->draw()函数。具体代码如下:
//画圆
$mycircle = new circle();
$mycircle->x = 100;
$mycircle->y = 100;
$mycircle->radius = 50;
$mycircle->color = "red";
drawShape($mycircle);
//画直线
$myline = new line();
$myline->x1 = 100;
$myline->y1 = 100;
$myline->x2 = 200;
$myline->y2 = 200;
$myline->color = "blue";
drawShape($myline);
运行结果如下:
Draw Cicle: Color red; (100, 100); Radius 50
Draw Line: Color blue; (100, 100) => (200, 200)
可以看到,$mycircle对象和$myline对象的内容都可以传递到参数$shape中。