PHP Data Mapper setter / getters

时间:2011-07-23 08:37:47

标签: php mysql oop class datamapper

我被建议使用Mappers将db中的对象存储与实际对象行为分开,这听起来不错。但是,习惯于其他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类根本不必知道db列名。

这种做法是否正确?还有更好的吗? 感谢

1 个答案:

答案 0 :(得分:2)

我建议Data Access Objects是你想要实现的更合适的模式。您在上面展示的Mapper只会增加复杂性,但并没有提供太多的好处。

就getter和setter而言,您可以使用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
$user = new User(array('foo' => 'bar'));

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

您也可以使用现有的PHP ORM library来简化这一切。