文章教程

7.4.1通过赋值复制对象

9/17/2020 9:38:49 PM 人评论 次浏览

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中。

教程类别