首页 > 代码库 > PHP 魔术方法 __clone __toString(五)

PHP 魔术方法 __clone __toString(五)

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

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

 

__clone()

<?phpclass example{    public static $pa;    public $pb;    public function __construct(){        $this->pb = ++self::$pa;    }        public function __clone(){        $this->pb = ‘no zuo no die‘;    }}$a = new example;$b = new example;$c = clone $b;$b->pb = ‘I Love You So Much!‘;echo $a->pb;echo ‘<hr/>‘;echo $b->pb;echo ‘<hr/>‘;echo $c->pb;echo ‘<hr/>‘;echo $b->pb;?>

 结果如下

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

 

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

<?phpclass SubObject{    static $instances = 0;    public $instance;    public function __construct() {        $this->instance = ++self::$instances;    }    public function __clone() {        $this->instance = ++self::$instances;    }}class MyCloneable{    public $object1;    public $object2;    function __clone()    {              // 强制复制一份this->object, 否则仍然指向同一个对象        $this->object1 = clone $this->object1;    }}$obj = new MyCloneable();$obj->object1 = new SubObject();$obj->object2 = new SubObject();$obj2 = clone $obj;print("Original Object:\n");print_r($obj);print("Cloned Object:\n");print_r($obj2);?>

 最后的结果

Original Object:MyCloneable Object(    [object1] => SubObject Object        (            [instance] => 1        )    [object2] => SubObject Object        (            [instance] => 2        ))Cloned Object:MyCloneable Object(    [object1] => SubObject Object        (            [instance] => 3  /*可能这里比较难以理解,其实就是$obj2当克隆的时候将最后的instance为2的结果克隆,并且再执行SubObject::__clone方法*/        )    [object2] => SubObject Object        (            [instance] => 2        ))

 

 

__toString()

<?php// Declare a simple classclass TestClass{    public $foo;    public function __construct($foo)     {        $this->foo = $foo;    }    public function __toString() {        return $this->foo;    }}$class = new TestClass(‘Hello‘);echo $class;?>

 结果

Hello

 

PHP 魔术方法 __clone __toString(五)