У меня есть объект 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
почему признак не действует на соединение с БД клонированного объекта, а вместо этого получает соединение от исходного объекта?