有人建议我使用 Mappers 将数据库中的对象存储与真实对象行为分开,这听起来是个不错的主意。但由于习惯了其他 OOP 语言,如 Java 或 SmallTalk,我总是尽可能地封装我的对象。 我已经阅读了几个映射器示例,其中一些示例直接访问域对象的变量(这是我最后的选择,尽管我知道它更舒服)。
我目前想出的唯一解决方案是这样的:
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);
}
}
映射是因为类 User 根本不需要知道数据库列名。
这种方法是否正确?有更好的吗? 谢谢
最佳答案
我建议 Data Access Objects是您想要实现的更合适的模式。您上面显示的 Mapper 只会增加复杂性,但并没有真正提供太多好处。
在getters和setters方面,可以使用一些PHP的magic methods清理上面的代码。以下内容允许您将数据存储在 protected 数组中,同时提供对它的访问,看起来好像只是通过对象属性,但实际上是通过一种方法(这样您就可以在那里提供自己的逻辑;将内容设置为只读,或者隐藏一些,等等)。
<?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
$user = new User(array('foo' => 'bar'));
// Outputs "bar"
echo $user->foo;
您也可以使用现有的 PHP ORM library 为自己简化这一切.
关于PHP 数据映射器 setter / getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799259/