PHP 数据映射器 setter / getter

标签 php mysql oop class datamapper

有人建议我使用 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/

相关文章:

javascript - 原型(prototype)与类

php - 显示数组 php 时出现问题

PHP preg_match 停止代码执行而不会出现错误

php - 按特定类别从数据库中获取博客

php - 选择以特定字母或数字开头的所有记录

c# - 如何决定一个方法是私有(private)的、 protected 、内部的还是公共(public)的?

PHP 和 FPDI/FPDF : Fatal error: Uncaught Exception: FPDF error: Incorrect output destination

php - 在行组中显示结果并对每个组值求和

mysql - openshift mysql无法启动mysql

oop - Moose::Role 的怪异与重写方法