2011-07-01 3 views
1

のC#-esqueプロパティを作成し、私が持っている:でダム実験 - 私は今PHP</p> <p>のC#-esqueプロパティを作成するために、優雅な方法を考え出すしようとしているPHP

class Example 
{ 
    private $allowedProps = array('prop1', 'prop2', 'prop3'); 
    private $data = array(); 

    public function __set($propName, $propValue) 
    { 
     if (in_array($propName, $this->allowedProps)) 
     { 
      // set property 
     } 
     else 
     { 
      // error 
     } 
    } 

    public function __get($propName) 
    { 
     if (array_key_exists($propName, $this->data)) 
     { 
      // get property 
     } 
     else 
     { 
      // error 
     } 
    } 
} 

をコメントアウトされたセクションは、単に$dataアレイに書き込んだり取り出すよりも複雑な場合は、if-elseまたはswitchでロジックを必要に応じて分岐するのが最も簡単です。しかし、それは面倒です、そして、私が欲しいものに逆らって走ります。 $data配列にアクセスできるコールバック関数を呼び出す方法はありますか?


EDIT:

class Example 
{ 
    private $allowedProps = array('prop1', 'prop2', 'prop3'); 
    private $data = array(); 

    public function __set($propName, $propValue) 
    { 
     $propName = strtolower($propName); 

     if (in_array($propName, $this->allowedProps)) 
     { 
      $funcName = "set" . ucfirst($propName); 
      $this->$funcName($propValue); 
     } 
     else 
     { 
      // error 
     } 
    } 

    public function __get($propName) 
    { 
     $propName = strtolower($propName); 

     if (array_key_exists($propName, $this->data)) 
     { 
      $funcName = "get" . ucfirst($propName); 
      $this->$funcName(); 
     } 
     else 
     { 
      // error 
     } 
    } 

    private function getProp1() 
    { 
     // do stuff, and return the value of prop1, if it exists 
    } 

    // ... 
} 

私はプライベートsetterメソッドとgetterメソッドのホストを持つことが移動するための方法であるかどうかわからないんだけど:最も簡単な方法は次のようになりますように思えます。 Lambdaはおそらく理想的ですが、PHP 5.3以降でのみ利用可能です。

+1

例[here](http://forums.whirlpool.net.au/archive/953482)の行に沿って何かを使用できますか?また、この質問に興味があるかもしれません:[私はどのようにPHPでコールバックを実装するのですか?](http://stackoverflow.com/questions/48947/how-do-i-implement-a-callback-in-php) – R0MANARMY

+0

By方法、プロパティを作成するC#の方法は、get_Foobar()メソッドとset_Foobar(val)メソッドを持つことです。実際に、これらのメソッドをクラスに作成してコンパイルすると、ゲッターとセッターで単一の「Foobar」プロパティとして表示されます。 –

+0

真実ですが、明示的なセッター/ゲッターメソッドに頼らずに、個々のクラスデータメンバーごとに何か複雑なことができるかどうかを確認しようとしています。 $ stock-> GetUpdatedQuote()よりむしろ$ stock-> GetQuoteQuote() –

答えて

0

それ自体は答えではありませんが、それ以上の実験をする時間がないので、私はそれを今解決していると思いました。もちろん、追加の提案は大歓迎です。

関連する問題