我正在尝试做一些非常基本的数据库Map转换,我从数据库中获取数据,然后尝试将数组转换为任意类的示例。这应该是动态的,以便无论输出对象类/属性如何,我都可以使用相同的函数。
假设我有案例1:
$student = [
'name' => 'Jhon',
'surname' => 'Wick',
'age' => 40
];
class Student{
private string $name;
private string $surname;
private int $age;
... getter and setters
}
案例2:
$car = [
'manufacturer' => 'Toyota',
'model' => 'one of their model',
'commercialName' => 'the name'
];
class Car{
private $manufacturer;
private $model;
private $commercialName;
// Getter and Setter
}
我想把$student数组的var转换成Student示例,或者把$car转换成Car,我该怎么做呢?我知道我可以用类似这样的方法来做:
$funcName = 'get' . ucfirst($camelCaseName);
if (method_exists($this, $funcName)) {
$funcValue = $this->$funcName();
}
但是我正在寻找一些更现代的东西,比如使用反射。什么是最好的方法?什么是有效的解决方案?
为了给予更多的信息,这是WordPress $wpdb对象的扩展所需要的。如果可能的话,我不想使用公共类属性,因为我可能需要在某些情况下实际调用类setter来更改其他类的值。让我们假设像给出出生日期这样的东西应该计算年龄
2条答案
按热度按时间1sbrub3j1#
正如我在评论中已经说过的,你所需要的只是水合的过程。来自Laminas的男孩和女孩得到了一个维护良好的包,叫做
laminas/laminas-hydrator
,它可以为你做这项工作。举个简单的例子:
你的方法并没有那么错。至少它的方向是正确的。在我看来,你不应该使用私有属性。你期望使用私有属性有什么样的好处?它们只会带来缺点。想想你的模型的扩展。受保护的属性做同样的工作,只是通过getter和setter访问属性。受保护的属性更容易处理。
这是你能得到的最简单的水合器。它迭代数据数组,创建setter方法名,并检查它们是否可调用。如果是,值将通过调用setter方法水合到对象中。最后你将得到一个水合对象。
但是要小心。这个解决方案有一些绊脚石需要考虑。你的数据数组的键必须和你的数据对象或实体的属性完全一样命名。当你想在你的数组中使用下划线分隔的键,但是你的对象属性是驼峰大小写时,你必须使用一些命名策略,另一个问题可能是类型提示。如果示例有生日,并且只接受
DateTime
示例,而您的数据数组只包含生日字符串"1979-12-19"
,该怎么办?如果您的数据数组包含子数组,在n:m关系中应该被水合的东西所有这些都已经在menetiond laminas Package 中完成了。如果你不需要所有那些花哨的东西,按照你的第一个想法,建立你自己的补水器。)
5lhxktic2#
我建议删除setter/getter并使用
readonly
属性: