OOP中__clone(),__toString(),__autoload(),__destruct的使用

有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“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()函数是在该类执行所有的操作动作之后被自动执行的,用来销毁该类的对象的!
只要我们在类中定义了,就不用管他了,在所有结束后,该类会自动执行!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值