将数组转换为对象
现在让我们创建一个数组来保存将要传输到类的数据。
$arr['name'] = "Adam"; $arr['phone'] = "123456"; $arr['email'] = "jack@onitroad"; $arr['address'] = "U.S";
太好了,让我们将数组数据转换为类。
$obj = Converter::toObject($arr, new Employee()); var_dump($obj);
看看结果:
凉爽的!!
我们可以使用 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是从数组到对象转换过程中生成的对象。
在这篇文章中,我们将使用 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 这样的 lowerCamelCase 成员变量。
要测试这个转换器类,我们需要创建一个具有属性和方法(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; } }
日期:2020-07-15 11:16:23 来源:oir作者:oir