我在DataMapper中實現了一個小型IdentityMap,並且它以它知道對象是否已經加載的方式正常工作但它不會正確分配內存對象。將對象傳遞給方法,將該對象分配給另一個對象,傳遞給對象仍然是我傳入的同一對象
我已經儘可能地簡化了代碼(它並不複雜)到一個實體,沒有數據庫等。有人可以解釋爲什麼在lookup()方法沒有正確地分配已經加載的Customer對象在Customer對象中傳入?
Customer.php
class Customer {
private $id;
private $name;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
}
CustomerMapper
class CustomerMapper {
private $identityMap;
public function __construct(IdentityMap $identityMap) {
$this->identityMap = $identityMap;
}
public function fetch(Customer $customer) {
if($this->identityMap->lookup($customer)) {
return true;
}
$this->assign($customer, array('id' => 1, 'name' => 'John'));
}
private function assign(Customer $customer, Array $row) {
$customer->setId($row['id']);
$customer->setName($row['name']);
$this->identityMap->add($customer);
}
}
IdentityMap
class IdentityMap {
private $customers;
public function lookup(Customer $customer) {
if(!array_key_exists($customer->getId(), $this->customers)) {
return false;
}
$customer = $this->customers[$customer->getId()]; //Something wrong here?
return true;
}
public function add(Customer $customer) {
$this->customers[$customer->getId()] = $customer;
}
}
當我然後運行這個:
$identityMap = new IdentityMap();
$customerMapper = new CustomerMapper($identityMap);
for($i = 0; $i < 3; $i++){
$customer = new Customer();
$customer->setId(1);
$customerMapper->fetch($customer);
echo 'ID: ' . $customer->getId() . '<br>Name: ' . $customer->getName() . '<br><br>';
}
輸出:
ID: 1
Name: John
ID: 1
Name:
ID: 1
Name:
爲什麼第二個和第三個顧客對象沒有名字?我相當確定lookup()方法中的分配部分存在問題。自從昨晚嘗試和閱讀所有內容以來,我一直都在這裏。
我已將lookup()方法簽名更改爲在傳入的對象前面有「&」符號,但沒有運氣。
我們必須更深入。就像一個觀點! – Dropout
試試這個,'公共函數查找(Customer&$ customer)',以便它通過引用而不是按值傳遞。 –
@MichaelPerrenoud嘗試過,沒有運氣。還有其他建議嗎?它應該在理論上工作,但不應該呢?我不知道什麼是錯的。 – ibanore