我有一个PHP对象,其中附加了一些数据库方法。如果我克隆对象,请在克隆上设置一个新的数据库连接(与原始对象的数据库连接不同),然后调用$clone->getDB()
,它将按预期返回新设置的数据库连接。
但是,如果我使用设计用于更新与原始对象相关联的不同数据库记录的特性的对象进行克隆,则特征会针对原始数据库而不是克隆中更新的数据库执行操作。 / p>
它看起来像这样:
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
为什么特征不作用于克隆对象的数据库连接,而是从原始对象获取连接?