2016-04-14 3 views
1

私はPHPでカスタムDBテーブルマッパーを開発中です。 PHPではプロパティにアクセスするために「仮想メソッド」のようなものを作ることは可能ですか?メソッドのように、実際には存在しません。動的PHPメソッド

例:クラス "user"は "$ name"というプロパティを持っていますが、私はこのメソッドの "Get"メソッドを作成したくありませんが、このようにvirtualメソッドでプロパティにアクセスしたい:$ user-> GetName();

私はConventionsで作業することを考えていました。したがって、 "仮想"メソッドが呼び出されるたびに、それを捕まえ、接頭辞 "Get"または "Set"があるかどうかをチェックします。

接頭辞が「Get」の場合、「Get」の後に部品を取り除いて小文字にして、アクセスするプロパティを持ってください。

私の考え(擬似コード):

public function VirtualMethodCalled($method_name) 
{ 
    //Get the First 3 Chars to check if Get or Set 
    $check = substr($method_name, 0, 3); 

    //Get Everything after the first 3 chars to get the propertyname 
    $property_name = substr($method_name, 3, 0); 

    if($check=="Get") 
    { 
     return $this->{$property_name}; 
    } 
    else if($check=="Set") 
    { 
     $this->{$property_name}; 
     $this->Update(); 
    } 
    else 
    { 
     //throw exc 
    } 
} 
+1

PHPには、あなたが使用できるいくつかの[魔法の方法](http://php.net/__get)があります。 –

+0

おそらくクロージャを調べることができます。 PHPでのクロージャは、実際にグローバル名前空間に登録されていないone-off *の関数/メソッド*です。あなたが望むなら、捨て去る機能。通常、現在使用されている関数/メソッドに機能を拡張するために使用されます。例3を参照してください:http://php.net/manual/en/functions.anonymous.php – Marcus

答えて

3

あなたはこれを達成するための魔法のメソッドを使用することができ、例:

class A { 

    private $member; 


    public function __call($name, $arguments) { 
     //Get the First 3 Chars to check if Get or Set 
     $check = substr($method_name, 0, 3); 

    //Get Everything after the first 3 chars to get the propertyname 
    $property_name = substr($method_name, 3); 

    if($check=="Get") 
    { 
     return $this->{$property_name}; 
    } 
    else if($check=="Set") 
    { 
     $this->{$property_name} = $arguments[0]; //I'm assuming 
    } 
    else 
    { 
     //throw method not found exception 
    } 
    } 
} 

は、私は主にあなたが内容のために提供されたコードを使用しています。明らかにこれを拡張して、関数名のエイリアスや必要なものを処理することもできます。

+0

が完璧に機能しました!ありがとうございました。 –

+0

__callマジックメソッドを使用する代わりに、メソッド名の最初の3文字をチェックする必要がありますが、あなたの意図は__setと__getを使用する方が良いでしょう。どちらのソリューションも問題を解決しますが、後者の方が優れたプログラミングスタイルです。また、メソッド/関数名にPascalCaseの規約を使用していることに気付きました。これはcamelCaseが普及しているPHPの世界ではめったにありません。 –

+0

@DanielStefaniuk元の質問は動的セッターとゲッターメソッドを引用していますが、setters/getterがJava対C#プログラミングの慣習にも見られるアクセサー/修飾子よりも優れた慣行であるなら、ここではもっと大きな議論があります。私は一般的に他のプロパティのsetterとgetterを使用するので、これらのことについて__callメソッドを実装することをお勧めします。したがって、全体的なコードでは単一の規約が使用されます。 – apokryfos