Я не понимаю цель фрагмента кода - PullRequest
2 голосов
/ 25 июня 2019

В обзоре Zend Frameword 2.5 и видел некоторый код, он работает нормально, но моя IDE показывает ошибку об этом. Я не знаю цели этого фрагмента кода. Зачем писать: $ this-> table = clone $ this-> table;

Github Link: 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 ]

1 голос
/ 25 июня 2019

Я не могу понять цель 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);
?>
0 голосов
/ 17 июля 2019

clone (или __clone) - это так называемый магический метод. Обратитесь к справке по другим магическим методам в документации php по магическим методам здесь .
Также проверьте специальную документацию для clone, где они объясняют работу этого магического метода:

Копия объекта создается с использованием ключевого слова clone (которое вызывает метод объекта __clone (), если это возможно). Метод объекта __clone () не может быть вызван напрямую.

Другими словами, он позволяет вам определять пользовательское поведение клонирования для экземпляра объекта внутри определения его класса, используя публичный метод __clone. Этот метод будет вызываться «магически», когда вы делаете:

$clone = clone $instance;
...