gpt4 book ai didi

php - 通过数组定义类选项是一种不好的做法吗?

转载 作者:可可西里 更新时间:2023-11-01 13:34:35 26 4
gpt4 key购买 nike

当我们查看 Dojo、Mootools、jQuery、JS Prototype 等 Javascript 框架时,我们会发现选项通常是通过这样的数组定义的:

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']);

这种模式有名称吗?您认为这是一种不好的做法吗?

为了简单起见,我在示例中保留了验证等内容。

最佳答案

有好有坏。

优点:

  • 不需要多个方法签名(即在支持的情况下重载)
  • 与上一点保持一致:可以以任何顺序使用参数调用方法
  • 参数可以动态生成,无需指定每个将出现的参数(例如:您根据用户输入动态创建一个参数数组并将其传递给函数)
  • 无需像 setNamesetThissetThat 等“样板”方法,尽管您可能仍想包含它们
  • 可以在函数体中定义默认值,而不是签名(jQuery 经常使用这种模式。它们经常$.extend 传递给带有默认值数组的方法的选项。在您的情况下,您将使用 array_merge())

缺点:

  • 除非您正确宣传每个选项,否则您的类(class)可能会更难使用,因为很少有人知道支持哪些选项
  • 当您提前知道需要传递哪些参数时,创建一组参数就又多了一步
  • 默认值的存在对用户来说并不总是很明显,除非提供文档或他们可以访问源代码

在我看来,这是一项很棒的技术。我最喜欢的方面是您不需要提供具有不同签名的重载方法,而且签名不是一成不变的。

关于php - 通过数组定义类选项是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com