当我们查看Javascript框架(如Dojo、Mootools、jQuery、JS原型等)时,我们看到选项通常是通过如下数组定义的:
dosomething('mainsetting',{duration:3,allowothers:true,astring:'hello'});在编写PHP类时实现相同的想法是一种糟糕的做法吗?
一个例子:
class Hello {
private $message = '';
private $person = '';
public function __construct($options) {
if(isset($options['message'])) $this->message = $message;
if(isset($options['person'])) $this->person = $person;
}
public function talk() {
echo $this->person . ' says: ' . $this->message;
}
}常规方法:
class Hello {
private $message = '';
private $person = '';
public function __construct() {}
public function setmessage($message) {
$this->message = $message;
}
public function setperson($person) {
$this->person = $person;
}
public function talk() {
echo $this->person . ' says: ' . $this->message;
}
}第一个例子的优点是,您可以传递任意多的选项,类只会提取它需要的选项。
例如,当从JSON文件中提取选项时,这是很方便的:
$options = json_decode($options);
$hello = new Hello($options);我就是这样做的:
$options = json_decode($options);
$hello = new Hello();
if(isset($options['message'])) $hello->setmessage($options['message']);
if(isset($options['person'])) $hello->setperson($options['person']);这种模式有名字吗?你认为这是一种不好的做法吗?
为了保持简单,我在示例中保留了验证等内容。
发布于 2010-12-28 22:32:04
有好的方面也有坏的方面。
The good:
setName、setThis、setThat等“样板”方法,尽管您可能仍然希望将它们包括在内。$.extend。在您的例子中,您将使用array_merge())The bad:
在我看来,这是一种很棒的技术。我最喜欢的一点是,您不需要提供具有不同签名的重载方法,而且签名也不是固定的。
发布于 2010-12-28 22:38:21
这种方法没有什么问题,特别是当您有很多需要传递给构造函数的参数的时候。这还允许您为它们设置默认值,并在构造函数中为它们设置array_merge() (有点像所有的jQuery插件)。
protected $default_params = array(
'option1' => 'default_value'
);
public function __construct($params = array()) {
$this->params = array_merge($this->default_params, $params);
}如果您想要这种“模式”的活生生的例子,请查看symfony框架,他们几乎在任何地方都使用它:这里是sfValidatorBase构造函数的一个例子
发布于 2010-12-28 22:42:09
当你给出参数名时,它被称为“命名符号”v.s。“位置表示法”,其中的参数必须在一个特定的顺序。
在PHP中,您可以传递一个"options“参数,以提供与其他语言(如Python)相同的效果,在那里您可以使用真正的命名符号。这并不是一种糟糕的做法,但通常是在有充分理由这样做的地方进行的(例如,在您的例子中,或者在存在大量争论且不需要按任何特定顺序设置的情况下)。
https://stackoverflow.com/questions/4550046
复制相似问题