我不明白代码段的目的

时间:2019-06-25 07:23:22

标签: zend-framework2

在Zend Frameword 2.5中进行了回顾,并看到了一些代码,它可以正常工作,但我的IDE显示有关此错误。 我不知道此代码段的目的。 为什么要写:$ this-> table = clone $ this-> table;

Github链接:https://github.com/zendframework/zend-db/blob/master/src/TableGateway/AbstractTableGateway.php

功能:第529-544行

请向我解释一下。

public function __clone()
    {
        $this->resultSetPrototype = (isset($this->resultSetPrototype)) ? clone $this->resultSetPrototype : null;
        $this->sql = clone $this->sql;
        if (is_object($this->table)) {
            $this->table = clone $this->table;
        } elseif (
            is_array($this->table)
            && count($this->table) == 1
            && is_object(reset($this->table))
        ) {
            foreach ($this->table as $alias => &$tableObject) {
                $tableObject = clone $tableObject;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

我无法理解Zend的目的,但我希望在运行两个下面的代码段后,从不同的两个结果中,您可以理解

<?php
class A {
    public $foo = 1;
}  

class B {
    protected $value = 1;
    protected $bar = null;//
    public function __construct() {
      $this->bar = new A();
    }

    public function setValue($foo = 3){
      $this->value = $foo;
    }

    public function setFooBar($foo = 3){
      $this->bar->foo = $foo;
    }

    public function __clone() {
      $this->bar = clone($this->bar);
    }
}

$a = new B();
$c = clone($a);
$c->setFooBar(3);
$c->setValue(6);
var_dump($a);
echo "\n";
var_dump($c);
?>
<?php
class A {
    public $foo = 1;
}  

class B {
    protected $value = 1;
    protected $bar = null;//
    public function __construct() {
      $this->bar = new A();
    }

    public function setValue($foo = 3){
      $this->value = $foo;
    }

    public function setFooBar($foo = 3){
      $this->bar->foo = $foo;
    }
}

$a = new B();
$c = clone($a);
$c->setFooBar(3);
$c->setValue(6);
var_dump($a);
echo "\n";
var_dump($c);
?>

答案 1 :(得分:0)

clone(或__clone)是一种所谓的魔术方法。在php文档on magic methods here中检查其他魔术方法的参考。
还要检查the specific documentation for clone,他们在哪里解释了这种魔术方法的作用:

  

使用clone关键字(如果可能,它将调用对象的__clone()方法)创建对象副本。无法直接调用对象的__clone()方法。

换句话说,它允许您使用公共__clone方法在其类定义内为对象实例定义自定义克隆行为。这样做时,该方法将被称为“魔术”:

$clone = clone $instance;