从这里的文档: http://framework.zend.com/manual/en/learning.quickstart.create-model.html
我们可以看到:
// application/models/Guestbook.php
class Application_Model_Guestbook
{
protected $_comment;
protected $_created;
protected $_email;
protected $_id;
public function __construct(array $options = null)
{
if (is_array($options)) {
$this->setOptions($options);
}
}
public function __set($name, $value)
{
$method = 'set' . $name;
if (('mapper' == $name) || !method_exists($this, $method)) {
throw new Exception('Invalid guestbook property');
}
$this->$method($value);
}
public function __get($name)
{
$method = 'get' . $name;
if (('mapper' == $name) || !method_exists($this, $method)) {
throw new Exception('Invalid guestbook property');
}
return $this->$method();
}
public function setOptions(array $options)
{
$methods = get_class_methods($this);
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
return $this;
}
... following getters and setters...
我不明白而且没有解释(也许是因为它很容易),它做了什么,为什么我们需要 setOptions 方法?
我正在尝试遵循本指南,但我不能盲目地粘贴代码而不知道它存在的原因。我会对只包含getter和setter的模型感到满意,但是,如果我不使用这个setOptions方法,也许这一切都行不通。我很担心,因为我在构造函数上看到了这一点,所以它必须以某种方式重要。
任何人都可以帮我解决,如果我们真的需要这个,如果是的话,那是什么意思?
提前致谢。
答案 0 :(得分:3)
这只是各种ZF组件使用的模式。
您可以为许多组件的构造函数提供配置数组(选项)。通常,此类可配置组件的API包含一个setOptions方法,就像您在那里看到的那样。
这仅仅是快速入门的指南。我个人不遵循它,因为我认为模型应该遵循更多任务/特定于域的界面 - 例如,在我看来,留言板模型应该只接受构造函数中的特定事物,例如留言簿的所有者或这样,并且不允许“通用”选项列表。
答案 1 :(得分:3)
IMO最好采用这种方法,因为你可能会得到一系列“事物”(比如......来自形式),而不是离散变量。它的IMO更好,使用更具可读性
$this->setOption($form->getValues());
然后逐个调用
$data = $form->getValues();
$this->setName($data['name']);
$this->setSurname($data['surname']);
// ....
但是这个方法应该位于由Application_Model_Guestbook
扩展的某个父类中,这是我猜测的,超出了guickstart的范围。当数组中的选项缺少setter时,提出某种通知也可能是一种好习惯。