__clone()  - 当对象克隆的时候自动加载此方法

__toString() - 当对象需要echo打印输出的时候自动加载此方法

__clone()

  1. <?php
  2. class example{
  3. public static $pa;
  4. public $pb;
  5. public function __construct(){
  6. $this->pb = ++self::$pa;
  7. }
  8.  
  9. public function __clone(){
  10. $this->pb = 'no zuo no die';
  11. }
  12. }
  13.  
  14. $a = new example;
  15. $b = new example;
  16. $c = clone $b;
  17. $b->pb = 'I Love You So Much!';
  18.  
  19. echo $a->pb;
  20. echo '<hr/>';
  21. echo $b->pb;
  22. echo '<hr/>';
  23. echo $c->pb;
  24. echo '<hr/>';
  25. echo $b->pb;
  26. ?>

结果如下

  1. ------------------------------------------------------------------------------------
  2. I Love You So Much!
  3. ------------------------------------------------------------------------------------
  4. no zuo no die /*要不是有__clone()这个魔术方法,这边的结果应该是2*/
  5. ------------------------------------------------------------------------------------
  6. I Love You So Much!

php手册给了我们一个例子有些难以看懂,如下

  1. <?php
  2. class SubObject
  3. {
  4. static $instances = 0;
  5. public $instance;
  6.  
  7. public function __construct() {
  8. $this->instance = ++self::$instances;
  9. }
  10.  
  11. public function __clone() {
  12. $this->instance = ++self::$instances;
  13. }
  14. }
  15.  
  16. class MyCloneable
  17. {
  18. public $object1;
  19. public $object2;
  20.  
  21. function __clone()
  22. {
  23.  
  24. // 强制复制一份this->object, 否则仍然指向同一个对象
  25. $this->object1 = clone $this->object1;
  26. }
  27. }
  28.  
  29. $obj = new MyCloneable();
  30.  
  31. $obj->object1 = new SubObject();
  32. $obj->object2 = new SubObject();
  33.  
  34. $obj2 = clone $obj;
  35.  
  36. print("Original Object:\n");
  37. print_r($obj);
  38.  
  39. print("Cloned Object:\n");
  40. print_r($obj2);
  41.  
  42. ?>

最后的结果

  1. Original Object:
  2. MyCloneable Object
  3. (
  4. [object1] => SubObject Object
  5. (
  6. [instance] =>
  7. )
  8.  
  9. [object2] => SubObject Object
  10. (
  11. [instance] =>
  12. )
  13.  
  14. )
  15. Cloned Object:
  16. MyCloneable Object
  17. (
  18. [object1] => SubObject Object
  19. (
  20. [instance] => 3 /*可能这里比较难以理解,其实就是$obj2当克隆的时候将最后的instance为2的结果克隆,并且再执行SubObject::__clone方法*/
  21. )
  22.  
  23. [object2] => SubObject Object
  24. (
  25. [instance] =>
  26. )
  27.  
  28. )

__toString()

  1. <?php
  2. // Declare a simple class
  3. class TestClass
  4. {
  5. public $foo;
  6.  
  7. public function __construct($foo)
  8. {
  9. $this->foo = $foo;
  10. }
  11.  
  12. public function __toString() {
  13. return $this->foo;
  14. }
  15. }
  16.  
  17. $class = new TestClass('Hello');
  18. echo $class;
  19. ?>

结果

  1. Hello

PHP 魔术方法 __clone __toString(五)的更多相关文章

  1. PHP面向对象魔术方法之__toString函数

    l 基本介绍: 当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法. <?php header('content-type:text/html;charset=utf- ...

  2. PHP魔术方法__clone()篇

    PHP中定义了一个内置方法__clone()来调整兑现的克隆行为: 当一个对象被克隆的时候会自动执行__clone()方法,而复制的对象可以在其方法内进行调整 header('Content-type ...

  3. PHP常用魔术方法(__toString魔术方法)

    <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload_register('\\ ...

  4. PHP面向对象常见的关键字和魔术方法

    在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...

  5. PHP魔术方法和魔法变量详解

    一.魔术常量 __LINE__ 文件中的当前行号.__FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名. 自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对 ...

  6. 20191125PHP抽象类、接口和魔术方法

    抽象类 不能被实例化,用于其他类的继承.使用abstract(抽象).抽象方法一定是抽象类,抽象类不一定有抽象方法. 接口interface是特殊的抽象类. eg: <?php //抽象类 ab ...

  7. php中魔术方法有什么用

    在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. __construct ...

  8. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  9. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

随机推荐

  1. LINUX 内核导论

    http://blog.csdn.net/ljy1988123/article/category/1490573/2

  2. 编写3个不同版本的程序,令其均能输出ia的元素

    #include<iostream> #include<vector> #include<string> using namespace std; int main ...

  3. day06 Java基础

    1.二维数组格式一(列固定):数据类型[][] 变量名=new 数据类型[m][n]; 二维数组格式二(列变化):数据类型[][] 变量名=new 数据类型[m][]; 二维数组格式三:数据类型[][ ...

  4. SQL SERVER 中 GO 的用法2

    具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go  select *,  备注=case  when Grade>=90 then '成绩 ...

  5. Android进阶笔记07:Android之MVC 理解

     1. 为什么需要MVC ? 软件中最核心的,最基本的东西是什么?  答:是的,是数据.我们写的所有代码,都是围绕数据的.      围绕着数据的产生.修改等变化,出现了业务逻辑.      围绕着数 ...

  6. Android(java)学习笔记102:Map集合功能概述

    下面通过代码引入Map集合:如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生来说,是 ...

  7. Flask的部署

    当前对部署flask的一些学习: 1.全局安装nginx 1.1 nginx的配置文件怎么写? $ sudo rm /etc/nginx/sites-enabled/default $ sudo to ...

  8. storyBoard中的Segue跳转

    //———————————————--------------在不确定的Segue跳转-----------------------------------   多个按钮指向要跳转的视图 1.在一个恰 ...

  9. Python 中使用optparse进行参数解析

    使用过Linux/Unix的人都会知道,命令行下的很多命令都需要参数,在C语言中添加和解析参数比较繁琐.Python中提供了optparse模块可以非常方便地处理命令行参数.   1  命令行参数的样 ...

  10. Oracle 中记录用户登录信息

    我们可以使用 Oracle Audit 函数来记录用户登录信息,但是如果开放了 Audit 函数将会使 Oracle 性能下降,甚至导致 Oracle 崩溃.那我们如何才能记录用户登录信息呢?其实我们 ...