- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP编程中的__clone()方法使用详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
可以在对象类中定义一个__clone()方法来调整对象的克隆行为。此方法的代码将在克隆操作期间执行。除了将所有现有对象成员复制到目标对象之外,还会执行__clone()方法指定的操作。下面修改Corporate_Drone类,增加以下方法:
1
2
3
|
function
__clone() {
$this
->tiecolor =
"blue"
;
}
|
之后,创建一个新的Corporate_Drone对象,增加employeeid成员的值,克隆这个对象,然后输出一些数据,从而显示克隆对象的tiecolor确实是通过__clone()方法设置的。示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
// Create new corporatedrone object
$drone1
=
new
corporatedrone();
// Set the $drone1 employeeid member
$drone1
->setEmployeeID(
"12345"
);
// Clone the $drone1 object
$drone2
=
clone
$drone1
;
// Set the $drone2 employeeid member
$drone2
->setEmployeeID(
"67890"
);
// Output the $drone1 and $drone2 employeeid members
echo
"drone1 employeeID: "
.
$drone1
->getEmployeeID().
"<br />"
;
echo
"drone2 employeeID: "
.
$drone2
->getEmployeeID().
"<br />"
;
echo
"drone2 tiecolor: "
.
$drone2
->getTiecolor().
"<br />"
;
?>
|
程序运行结果 。
1
2
3
|
drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:
|
再来一个小例子:
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
29
30
31
32
33
|
<?php
class
Fruit {
private
$name
=
"水果"
;
private
$color
=
"颜色"
;
public
function
setName(
$name
){
$this
->name =
$name
;
}
public
function
setColor(
$color
){
$this
->color =
$color
;
}
function
showColor(){
return
$this
->color.
'的'
.
$this
->name.
"<br />"
;
}
function
__destruct(){
echo
"被吃掉了(对象被回收) <br />"
;
}
}
$apple
=
new
Fruit();
$apple
->setName(
"大苹果"
);
$apple
->setColor(
"红色"
);
echo
$apple
->showColor();
$clone_apple
=
$apple
;
$clone_apple
->setName(
"小苹果"
);
$clone_apple
->setColor(
"青色"
);
echo
$clone_apple
->showColor();
?>
|
上面只是将一个类赋值给另一个类,所以此时内存中仍是一个对象.
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
29
30
31
32
33
34
35
|
<?php
class
Fruit {
private
$name
=
"水果"
;
private
$color
=
"颜色"
;
public
function
setName(
$name
){
$this
->name =
$name
;
}
public
function
setColor(
$color
){
$this
->color =
$color
;
}
function
showColor(){
return
$this
->color.
'的'
.
$this
->name.
"<br />"
;
}
function
__destruct(){
echo
"被吃掉了(对象被回收) <br />"
;
}
function
__clone(){
$this
->name =
"克隆水果"
;
}
}
$apple
=
new
Fruit();
$apple
->setName(
"大苹果"
);
$apple
->setColor(
"红色"
);
echo
$apple
->showColor();
$clone_apple
=
clone
$apple
;
$clone_apple
->setColor(
"青色"
);
echo
$clone_apple
->showColor();
?>
|
clone方法克隆出了一个新的类,所以此时内存中有两个对象.
php的__clone()方法对一个对象实例进行的浅复制,对象内的基本数值类型进行的是传值复制,而对象内的对象型成员变量,如果不重写__clone方法,显式的clone这个对象成员变量的话,这个成员变量就是传引用复制,而不是生成一个新的对象.如下面一个例子的第28行注释所说 。
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
29
30
31
32
33
34
35
36
37
38
39
40
|
<?php
class
Account {
public
$balance
;
public
function
__construct(
$balance
) {
$this
->balance =
$balance
;
}
}
class
Person {
private
$id
;
private
$name
;
private
$age
;
public
$account
;
public
function
__construct(
$name
,
$age
, Account
$account
) {
$this
->name =
$name
;
$this
->age =
$age
;
$this
->account =
$account
;
}
public
function
setId(
$id
) {
$this
->id =
$id
;
}
public
function
__clone() { #复制方法,可在里面定义再
clone
是进行的操作
$this
->id = 0;
$this
->account =
clone
$this
->account; #不加这一句,account在
clone
是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改
}
}
$person
=
new
Person(
"peter"
, 15,
new
Account(1000));
$person
->setId(1);
$person2
=
clone
$person
;
$person2
->account->balance = 250;
var_dump(
$person
,
$person2
);
?>
|
输出
最后此篇关于PHP编程中的__clone()方法使用详解的文章就讲到这里了,如果你想了解更多关于PHP编程中的__clone()方法使用详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当克隆一个对象是另一个对象的子对象时,是否“需要”指示子类 __clone() 方法中的对象的所有父属性或子类 __clone()方法只能包含自己的不属于父对象的对象属性? 举个例子 对象 Child
引用this问题,我有另一个解决方案是使用 $obj2 = unserialize(serialize($obj1)); 代替 $obj2 = clone $obj1; 哪个更好用? 最佳答案 tl;
__clone() 的结果是“浅克隆”是什么意思? 最佳答案 这意味着当对象被克隆时,任何作为引用变量的属性(引用其他对象的变量,而不是值)将保持引用。 “非浅层”克隆会将新对象设置为这些属性的值,而
我有一个类 a 并使用 new 实例化它 $obja = new a; 我知道下面两行之间的区别 $obja2 = $ojba; $obja2 = clone $obja; 但是,即使您在类 a 中声
每当我尝试运行我的脚本时,我都会收到以下奇怪的错误消息。 我看不出有什么会导致问题 - 事实上,我的脚本中现在唯一处理异常的东西(它们是 future 添加的构建 block )是以下几行: clas
所以,我正在做一个项目,我遇到了一个问题,因为我不断收到错误和警告。我对 PHP 很陌生,所以要温柔。该程序使用 PHP 5.5 运行良好但是当我在 PHP 5.6 中运行该程序时,我收到如下几个错误
我刚开始使用 Symfony,但我不明白为什么在存储库中创建自定义函数时会出现此错误。 我的实体Category.php: name; } /** * Get id
我是一名优秀的程序员,十分优秀!