2011-07-23 58 views
1

我已經建議使用映射器來分離db中的對象存儲和真實對象行爲,這聽起來像個不錯的主意。但是習慣於Java或SmallTalk等其他OOP語言,我總是儘量封裝我的對象。 我讀過幾個mappers的例子,其中一些直接訪問域對象的變量(這將是我最後的選擇,但我知道它更舒服)。PHP數據映射器setter/getters

我現在想出的唯一辦法是這樣的:

class User{ 
    public __construct($mapped_data){ 
    foreach($data as $key=>$value){ 
     $this->$key=$value; 
    } 
... 
} 

class UserMapper{ 
    private populate($user,$db_data){ 
     ... 
     $map=array('id'=>'id','psw'=>'password','mail'=>'email', ...); 
     foreach($db_data as $key=>$value){ 
     $mapped_data[$map[$key]]=$value; 
     } 
     return new User($mapped_data); 
    } 
} 

地圖是因爲該類用戶不必在所有知道的數據庫列名。

這種方法是否正確?有更好的嗎? 謝謝

+0

除非您打算讓其他用戶可以使用該類,對我而言,這種方法只是膨脹。該類不會是獨立的,它仍然依賴於映射器而不是數據庫名稱。所以映射器就像一個配置文件。如果您打算將其提供給其他人,這將會很有用。恕我直言 –

+0

所以我最好在班上爲每個變量都設置一個setter和getter? (或者只是讓它們全部公開)。 – Riskz

回答

2

我會建議Data Access Objects是一個更合適的模式,你想實現什麼。上面顯示的Mapper增加了複雜性,但並沒有真正提供很多好處。

在獲取和設置方面,您可以使用一些PHP的magic methods來清除上面的代碼。以下允許您將數據存儲在受保護的數組中,同時提供對該數據的訪問,看起來只是通過對象屬性,但實際上是通過一種方法(以便您可以在其中提供您自己的邏輯;使事物只讀,或隱藏一些等)。

<?php 
class User { 
protected $_data = array(); 
public function __construct($data) { 
    $this->_data = $data; 
} 

// Get any value 
public function __get($key) { 
    return array_key_exists($key, $this->_data) ? $this->_data[$key] : null; 
} 

// Set any value; leave out to make the data read only outside the class 
public function __set($key, $val) { 
    $this->_data[$key] = $val; 
} 

// You should also implement __isset() and __unset() 
} 

然後,您可以通過使用現有PHP ORM library訪問數據,如

<?php 
$user = new User(array('foo' => 'bar')); 

// Outputs "bar" 
echo $user->foo; 

您可能還簡化了這一切爲自己。

+0

我會看看那些圖書館。你會推薦我哪一個? – Riskz

+0

我還沒有和任何人打過交道;我寫了我自己的,然後希望我使用了其中的一個);我在使用Symfony框架時稍微使用了Doctrine,它可能是一個開始的好地方。 –

+0

正在下載...因爲我讀過它會使我的工作更輕鬆。謝謝 – Riskz