Клонировать объект с чертой - PullRequest
0 голосов
/ 28 августа 2018

У меня есть объект PHP, к которому прикреплены некоторые методы БД. Если я клонирую объект, устанавливаю новое соединение с БД на клон (отличное от соединения с БД исходного объекта), а затем вызываю $clone->getDB(), он возвращает вновь установленное соединение с БД, как и ожидалось.

Однако, если я клонирую объект, использующий черту, предназначенную для обновления другой записи базы данных, связанной с исходным объектом, черта выполняет действие с исходной БД, а не с обновленной БД на клоне.

Это выглядит примерно так:

class Product extends DBModel
{
    use UpdateInventoryTrait;

    public $item_id;
    public $cost;
    public $warehouse;
    public $db_connection;

    public function save()
    {
        $sql = "INSERT INTO table (item_id, cost, warehouse) values($this->item_id, $this->cost, $this->warehouse)"; // pseudo-code
        $this->getDBConnection()->query($sql);
        // execute action available in the Trait
        $this->updateInventory();
    }

    public function getDBConnection()
    {
        return $this->db_connection;
    }

    public function setDBConnection($new_connection)
    {
        $this->db_connection = $new_connection;
    }
}

trait UpdateInventoryTrait
{
    public function updateInventory()
        {
            $connection = $this->getDBConnection();

            // do some stuff with db_connection
        }
}

Итак, у меня есть Product:

echo $product instanceof Product; // true
echo $product->getDBConnection(); // connection A
$product2 = clone($product);
$product2->setConnection($b);
echo $product2->getConnection(); // connection B
$product2->save(); // and the updateInventory action writes against connection A

почему признак не действует на соединение с БД клонированного объекта, а вместо этого получает соединение от исходного объекта?

...