当有很多默认选项并且您需要能够覆盖它们时 - 正如您之前在 jQuery 中看到的那样.extend()
- 我喜欢使用这种简单快捷的方法:
class Foo {
private $options;
public function __construct($override = array()) {
$defaults = array(
'param1' => 'foo',
'param2' => ...,
'paramN' => 'someOtherDefaultValue');
$this->options= array_replace_recursive($defaults, $override);
}
}
特别是对于开始类来说,这是一种非常简单和灵活的方式,但正如已经提到的,如果该代码将被大量使用,那么使用 getter 和 setter 对这些选项进行更多控制可能不是一个坏主意,尤其是如果您需要在获取或设置其中一些选项时采取措施,例如在我正确理解您的问题的情况下依赖关系。
另请注意,您不必自己实现 getter 和 setter,在 PHP 中您可以使用 __get 和 __set 魔术方法。
它遵循一些无用的代码,希望能提供一些想法:
[...inside Foo...]
public function __set($key, $value){
switch(true){
//option exists in this class
case isset($this->options[$key]):
//below check if $value is callable
//and use those functions as "setter" handlers
//they could resolve dependencies for example
$this->options[$key] = is_callable($value) ? $value($key) : $value;
break;
//Adds a virtual setter to Foo. This so called 'magic' __set method is also called if the property doesn't exist in the class, so you can add arbitrary things.
case $key === 'someVirtualSetterProp': Xyzzy::Noop($value); break;
default:
try{ parent::__set($key, $value); } catch(Exception $e){ /* Oops, fix it! */ }
}
}
请注意,在上面的示例中,我采用了不同的方法,这样混合它们通常没有意义。我这样做只是为了说明一些想法,希望您能够更好地决定什么更适合您的需求。