Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数据映射器设置器/获取器_Php_Mysql_Oop_Class_Datamapper - Fatal编程技术网

PHP数据映射器设置器/获取器

PHP数据映射器设置器/获取器,php,mysql,oop,class,datamapper,Php,Mysql,Oop,Class,Datamapper,有人建议我使用映射器将db中的对象存储与真实对象行为分开,这听起来是个不错的主意。但由于习惯了Java或SmallTalk等其他OOP语言,我总是尽可能地封装我的对象。 我已经阅读了几个映射器示例,其中一些直接访问域对象的变量(这将是我最后的选择,尽管我知道这样更方便) 我目前提出的唯一解决方案是: class User{ public __construct($mapped_data){ foreach($data as $key=>$value){ $this-

有人建议我使用映射器将db中的对象存储与真实对象行为分开,这听起来是个不错的主意。但由于习惯了Java或SmallTalk等其他OOP语言,我总是尽可能地封装我的对象。 我已经阅读了几个映射器示例,其中一些直接访问域对象的变量(这将是我最后的选择,尽管我知道这样更方便)

我目前提出的唯一解决方案是:

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);
   }
}
映射是因为类用户根本不必知道db列名

这种方法正确吗?有更好的吗? 谢谢

我建议这是一种更适合您实现目标的模式。上面显示的映射器只是增加了复杂性,但实际上并没有带来多少好处

关于getter和setter,您可以使用一些PHP来清理上面的代码。以下内容允许您将数据存储在受保护的阵列中,同时提供对数据的访问,看起来它只是通过object属性,但实际上是通过一个方法(这样您就可以在其中提供自己的逻辑;将内容设置为只读,或隐藏一些内容,等等)


除非您计划让该类可供其他用户使用,否则对我来说,这种方法只是膨胀。该类不是独立的,它仍然依赖于映射程序而不是db名称。因此,映射器的工作方式类似于配置文件。如果您计划将其提供给其他人,这将非常有用。为什么我最好为类中的每个变量都设置一个setter和getter?(或者干脆把它们都公之于众)我来看看那些图书馆。你会推荐我哪一个?我没有和任何人合作过很多;我写了我自己的,然后希望我用其中一个来代替;)在使用Symfony框架时,我确实使用了一些原则,这可能是一个很好的开始。下载。。。因为我读过的书会让我的工作更轻松。谢谢
<?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;