私は .Net のバックグラウンドを持っており、PHP で慣れ親しんだプログラミング パターンに頭を悩ませようとしています。
連想配列プロパティを持つクラスがあります。連想配列キーのすべてではなく一部をクラスレベルのプロパティに「昇格」したいと思います。C# では、通常は次のようにします。
//C# Code
class MyClass{
private Dictionary<string, string> attributes = new Dictionary<string,string>();
//Get/Set the ID from the private store
public string ID{
get { return (attributes.ContainsKey("ID") ? attributes["ID"] : "n/a"); }
set { attributes.Add("ID", value); }
}
}
これにより、オブジェクトが欠落しているプロパティのデフォルト値を制御できるようになります。PHP では、これを直接行う方法が見つかりませんでした。私の最初の回避策は、単に関数を使用することでした:
//PHP Code
class MyClass{
private $attributes = array();
//Get the ID
public function getID(){
return (array_key_exists('ID', $this->attributes) ? $this->attributes['ID'] : 'n/a');
}
//Set the ID
public function setID($value){
$this->attributes['ID'] = $value;
}
}
これは機能しますが、呼び出し構文はわずかに異なり、プロパティごとに 2 つのメソッドがあります。また、これらのオブジェクトを使用しているコードは現在、オブジェクト変数を調べているため、関数が見つかりません。
次に、オブジェクト自体のマジック メソッド パス__set
と、渡されたオブジェクトのマジック メソッド パスをたどり、ローカル変数の設定/取得を開始しました。残念ながら、基になる配列を直接変更した場合、これらのメソッドは呼び出されません。__get
switch case
$name
私の質問は、PHP で、使用されるまで計算されないクラスレベルのプロパティ/変数を持つことは可能ですか?