gpt4 book ai didi

PHP 数据映射器 setter / getter

转载 作者:行者123 更新时间:2023-11-29 07:06:54 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com