zoukankan      html  css  js  c++  java
  • PHP 魔术方法 __clone __toString(五)

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

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

    __clone()

    <?php
    class 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手册给了我们一个例子有些难以看懂,如下

    <?php
    class 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:
    ");
    print_r($obj);
    
    print("Cloned Object:
    ");
    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 class
    class TestClass
    {
        public $foo;
    
        public function __construct($foo) 
        {
            $this->foo = $foo;
        }
    
        public function __toString() {
            return $this->foo;
        }
    }
    
    $class = new TestClass('Hello');
    echo $class;
    ?>
    

     结果

    Hello
  • 相关阅读:
    nginx超时重发
    excel另存为csv
    数据清洗——python定位csv中的特定字符位置
    pandas.read_csv参数整理
    Python 如何在csv中定位非数字和字母的符号
    ORACLE SEQUENCE用法(转)
    Python安装distribute包
    ex41习题 41: 来自 Percal 25 号行星的哥顿人(Gothons)
    利用python去除红章
    UNDO表空间
  • 原文地址:https://www.cnblogs.com/uduemc/p/4122296.html
Copyright © 2011-2022 走看看