OOP中__clone(),__toString(),__autoload(),__destruct的使用
来源:互联网 发布:日本好用的护肤品知乎 编辑:程序博客网 时间:2024/05/18 00:25
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。
在PHP5中我们使用”clone”这个关键字克隆对象;
01.
<?
02.
class
Person
03.
{
04.
//下面是人的成员属性
05.
var
$name
;
//人的名子
06.
var
$sex
;
//人的性别
07.
var
$age
;
//人的年龄
08.
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
09.
function
__construct(
$name
=
""
,
$sex
=
""
,
$age
=
""
)
10.
{
11.
$this
->name=
$name
;
12.
$this
->sex=
$sex
;
13.
$this
->age=
$age
;
14.
}
15.
//这个人可以说话的方法, 说出自己的属性
16.
function
say()
17.
{
18.
echo
"我的名子叫:"
.
$this
->name.
" 性别:"
.
$this
->sex.
" 我的年龄是:"
.
$this
->age.
"<br>"
;
19.
}
20.
}
21.
$p1
=
new
Person(
"张三"
,
"男"
, 20);
22.
//使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。
23.
$p2
=clone
$p1
;
24.
$p2
->say();
25.
?>
PHP5定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对象拥有相同属性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, ”__clone()”方法可以没有参数,它自动包含$this和$that两个指针,$this指向复本,而$that指向原本;
01.
<?
02.
class
Person
03.
{
04.
//下面是人的成员属性
05.
var
$name
;
//人的名子
06.
var
$sex
;
//人的性别
07.
var
$age
;
//人的年龄
08.
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
09.
function
__construct(
$name
=
""
,
$sex
=
""
,
$age
=
""
)
10.
{
11.
$this
->name=
$name
;
12.
$this
->sex=
$sex
;
13.
$this
->age=
$age
;
14.
}
15.
//这个人可以说话的方法, 说出自己的属性
16.
function
say()
17.
{
18.
echo
"我的名子叫:"
.
$this
->name.
" 性别:"
.
$this
->sex.
" 我的年龄是:"
.
$this
->age.
"<br>"
;
19.
}
20.
//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法
21.
function
__clone()
22.
{
23.
//$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。
24.
$this
->name=
"我是假的$that->name"
;
25.
$this
->age=30;
26.
}
27.
}
28.
$p1
=
new
Person(
"张三"
,
"男"
, 20);
29.
$p2
=clone
$p1
;
30.
$p1
->say();
31.
$p2
->say();
32.
?>
上例输出:
1.
我的名子叫:张三 性别:男 我的年龄是:20
2.
我的名子叫:我是假的张三 性别:男 我的年龄是:30
__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动调用的, 前面我们讲过对象引用是一个指针,比如说:“$p=new Person()“中,$p就是一个引用,我们不能使用echo 直接输出$p, 这样会输出”Catchable fatal error: Object of class Person could not be converted to string“这样的错误,如果你在类里面定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了”__toString()”方法, 输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句).
01.
<?php
02.
// Declare a simple class
03.
class
TestClass
04.
{
05.
public
$foo
;
06.
public
function
__construct(
$foo
) {
07.
$this
->foo =
$foo
;
08.
}
09.
//定义一个__toString方法,返加一个成员属性$foo
10.
public
function
__toString() {
11.
return
$this
->foo;
12.
}
13.
}
14.
$class
=
new
TestClass(
'Hello'
);
15.
//直接输出对象
16.
echo
$class
;
17.
?>
上例输出:Hello
__autoload的用法相当的简单,我们一般在实例化一个类时,都要include一个类文件,那么要是我们在所有实例化之前先定义这么一个方法的的话,
那么就不用每次都include了 代码如下:
1.
function
__autoload(
$className
){
2.
include
(
$className
.
".php"
);
//先后加载MyPc.php和FBB.php这两个类文件
3.
}
4.
$pp
=
new
MyPc();
5.
$bb
=
new
FBB();
__destruct()函数是在该类执行所有的操作动作之后被自动执行的,用来销毁该类的对象的!
只要我们在类中定义了,就不用管他了,在所有结束后,该类会自动执行!
- OOP中__clone(),__toString(),__autoload(),__destruct的使用
- OOP中__clone(),__toString(),__autoload(),__destruct的使用
- PHP | 魔术方法 | __toString(),__clone(),__call(),__autoload() 详解
- 魔术方法(__toString()+ __call()+ __clone() +__autoload())+单例模式
- 面向对象 魔术方法 __clone() __toString() __call() __autoload()
- php面向对象(OOP)—__toString()和__clone()
- PHP中__construct(), __destory(), __get(), __set(), __call(), __toString(), __clone
- PHP中__construct(), __destory(), __get(), __set(), __call(), __toString(), __clone()
- php中__autoload的使用
- php中__toString()方法及__call()方法的使用介绍
- PHP中__tostring 与 tostring的区别
- Lua中元方法__tostring的使用
- PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法
- php中__autoload和spl_autoload_register的用法
- 【php】“__toString()”方法使用
- PHP5—OOP,__autoload(类文件自动加载规则)的定义方法及分析
- __clone()
- php面向对象(OOP)—__autoload()函数
- Android Camera架构浅析
- Android 使用基站、wifi实现定位
- FreeBSD 历史
- 跨平台C++开发环境搭建——GNU+STL+Boost+wxWidget+OpenSceneGraph
- 一句话评论设计模式六大原则
- OOP中__clone(),__toString(),__autoload(),__destruct的使用
- 八款开源 Android 游戏引擎
- 关于职业规划的一些讨论
- OOP中__clone(),__toString(),__autoload(),__destruct的使用
- Android_Service 笔记(陆续更新)
- python自动化测试_从命令行指定测试用例
- 一个简单的绿色模板 但值得学习~!!! (我写了很好的注释)
- iOS-有用的sqlite命令和知识(不常用)
- c语言的字符数组