Home  >  Article  >  Backend Development  >  PHP magic method __clone __toString(5), __clone__tostring_PHP tutorial

PHP magic method __clone __toString(5), __clone__tostring_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:13:06904browse

PHP magic methods __clone __toString(5), __clone__tostring

__clone()  - This method is automatically loaded when the object is cloned

__toString() - This method is automatically loaded when the object needs echo printout

__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;
?>

The results are as follows

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

The PHP manual gives us an example that is somewhat difficult to understand, as follows

<?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:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>

Final result

Original <span>Object</span><span>:
MyCloneable </span><span>Object</span><span>
(
    [object1] </span>=> SubObject <span>Object</span><span>
        (
            [instance] </span>=> <span>1</span><span>
        )

    [object2] </span>=> SubObject <span>Object</span><span>
        (
            [instance] </span>=> <span>2</span><span>
        )

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

    [object2] </span>=> SubObject <span>Object</span><span>
        (
            [instance] </span>=> <span>2</span><span>
        )

)</span>

__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;
?>

Result

Hello

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/917481.htmlTechArticlePHP magic method __clone __toString(5), __clone__tostring __clone() - This method is automatically loaded when the object is cloned __toString() - automatically added when the object needs echo printout...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn