多くのデフォルトオプションがあり、それらを上書きできるようにする必要がある場合-以前に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! */ }
}
}
上記の例では、さまざまなアプローチで絞り込んでおり、通常、それらをそのように混在させることは意味がないことに注意してください。これは、いくつかのアイデアを説明するためだけに行ったものであり、ニーズに合ったものをより適切に決定できることを願っています.