当从SQL数据库实例化对象时,我读到我应该使用hydrate()
函数来直接填充我的对象而不是构造函数。
以下代码之间是否存在差异?
含水合物():
class User {
// attributes ...
public function __construct(array $data = array()) {
if (!empty($data)) {
$this->hydrate($data);
}
}
public function hydrate(array $data) {
foreach ($data as $key => $value) {
// One gets the setter's name matching the attribute.
$method = 'set'.ucfirst($key);
// If the matching setter exists
if (method_exists($this, $method)) {
// One calls the setter.
$this->$method($value);
}
}
}
// Getters/Setters and methods ...
}
直接进入构造函数:
class User {
// attributes ...
public function __construct(array $data = array()) {
if (!empty($data)) {
foreach ($data as $key => $value) {
// One gets the setter's name matching the attribute.
$method = 'set'.ucfirst($key);
// If the matching setter exists
if (method_exists($this, $method)) {
// One calls the setter.
$this->$method($value);
}
}
}
}
// Getters/Setters and methods ...
}
答案 0 :(得分:1)
当你拥有包含许多属性的类时,每个属性都拥有它自己的具有特定检查的setter,这是一种有用的方式来调用它们,而不是一个一个。
它的第二个目的是,如果你需要重新使用你的对象(让他们说要执行测试)和新值。您不必重建一个新的(或每个设置者),只需回忆水合物,您的类属性将被更新。
这是一个基本的例子:
<?php
class Test
{
protected $titre;
protected $date;
protected ...
// And so on
public function __construct($value = array())
{
if(!empty($value))
$this->hydrate($value);
}
public function hydrate($data)
{
foreach ($data as $attribut => $value) {
$method = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
if (is_callable(array($this, $method))) {
$this->$method($value);
}
}
}
public function setTitle($title)
{
// Do specific check
$this->title = $title;
}
public function setDate($date)
{
// Do specific check
$this->date = $date;
}
}
$test = new Test(array("title" => "helloworld", ...));
// Manipulate the $test var and change stuff
...
$new_values = array("title" => "Hello, I am back", ...);
$test->hydrate($new_values);
?>