在这篇文章中,我们将使用 PHP Hydrator 模式将数组转换为对象。这个方法很简单,就是将数据从一个地方传输到另一个地方。
我们将定义一个类,它将一个数组和一个对象作为输入,并搜索对象中的所有 set() 方法,并用数组中的值填充它。
首先,我们将使用 get_class() 函数确定对象类,然后使用 get_class_methods() 来获取类方法。
class Converter
{
public static function toObject(array $array, $object)
{
$class = get_class($object);
$methods = get_class_methods($class);
foreach ($methods as $method) {
preg_match(' /^(set)(.*?)$/i', $method, $results);
$pre = $results[1] ?? '';
$k = $results[2] ?? '';
$k = strtolower(substr($k, 0, 1)) . substr($k, 1);
If ($pre == 'set' && !empty($array[$k])) {
$object->$method($array[$k]);
}
}
return $object;
}
}
请记住,我们使用 PHP 7 合并运算符 (??),如果您不使用 PHP 7,则可以使用三元运算符。
我们使用 substr 然后连接,因为如果我们有像 $firstName 这样的小驼峰命名的成员变量。
为了测试这个转换器类,我们需要创建一个具有属性和方法(getter 和 setter)的类,并了解如何使用 PHP 将数组转换为对象。
假设我们有一个这样的员工类:
class Employee
{
protected $name;
protected $phone;
protected $email;
protected $address;
public function getName()
{
return $this->name;
}
public function getPhone()
{
return $this->phone;
}
public function getEmail()
{
return $this->email;
}
public function getAddress()
{
return $this->address;
}
public function setName($name)
{
$this->name = $name;
}
public function setPhone($phone)
{
$this->phone = $phone;
}
public function setEmail($email)
{
$this->email = $email;
}
public function setAddress($address)
{
$this->address = $address;
}
}
将数组转换为对象
现在让我们创建一个数组来保存将传输到类的数据。
$arr['name'] = "Adam";
$arr['phone'] = "123456";
$arr['email'] = "adam@mail.com";
$arr['address'] = "U.S";
太好了,让我们将数组数据转换为类。
$obj = Converter::toObject($arr, new Employee());
var_dump($obj);
看看结果:
Cool!!
您可以使用 PHP Hydrator 模式将数组转换为对象。
将对象转换为关联数组
将对象转换为关联数组怎么样,这是相同的概念,我们将创建一个执行相反操作的新函数。
我们的函数将以与之前的函数相同的方式搜索所有 get() 函数,如下所示:
public static function toArray($object)
{
$array = array();
$class = get_class($object);
$methods = get_class_methods($class);
foreach ($methods as $method) {
preg_match(' /^(get)(.*?)$/i', $method, $results);
$pre = $results[1] ?? '';
$k = $results[2] ?? '';
$k = strtolower(substr($k, 0, 1)) . substr($k, 1);
If ($pre == 'get') {
$array[$k] = $object->$method();
}
}
return $array;
}
将此函数添加到我们的转换器类中,并使用传递的对象调用它,如下所示:
var_dump(Converter::toArray($obj));
注意,这里传递的$obj是从数组到对象转换过程中生成的对象。
输出按预期显示关联数组。
我希望您觉得这篇文章有用。继续回来。
谢谢。