PHP中的水合物和构造函数

时间:2017-10-19 13:12:36

标签: php constructor

当从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 ...
}

1 个答案:

答案 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);
?>