2011-07-17 4 views
6

Javaから来ていますが、PHPを少し訪問しただけです。魔法のgetメソッドとsetメソッドを見ると、私の(Javaの影響を受けた)腹が痛くなり始めます。プロパティに直接アクセスしているかのように見えます(実際は__getと__setを使用しています)。少ないコードを除いて従来のゲッター/セッターメソッドの代わりに__get/__ setを使用する利点がありますか?

従来のgetX()/ setX()メソッドの代わりに、マジックゲッターとセッターメソッドを使用する利点はありますか? PHPをコーディングするときにそれらを使用する必要がありますか?

ありがとうございました!

+2

私はそれが便利だと感じることがありますが、私は他の理由で他の人に答えさせるでしょう。私は、__get/__ setを使用すると、はるかに遅い...約10倍多くのことを指摘します。私はなぜこれが自分自身でベンチマークされたのかわかりませんが、PHPのサイトには書かれています。 – Brad

+2

より一般的な「なぜプロパティーですか?」については、http://programmers.stackexchange.com/questions/62383/what-is-the-point-of-propertiesを参照してください。質問。 – delnan

答えて

1

__get__および__set__は完全に動的です。たとえば、遅延ロードを有効にするために呼び出された場合、データベース要求を開始することができます。もちろん、ゲッターやセッターでもこれを行うことができますが、毎回これを行う必要があります。すべてのプロパティ呼び出しが1つのメソッドに渡されるため、AOPのようなこともできます。つまり、すべて__get__/__set__は処理に時間がかかります。あなたはそれで本当に高度な/クールなものを行うことができます。

1

利点は、リファクタリングするときに、直接割り当て/読み取りを処理することができ、コードベース全体をすぐに変更する必要がなく、コードがいくぶん短くなり、人々がいくらか簡単に文字列を作成できることです:$title="<title>{$obj->title}</title>";$title='<title>'.$obj->getTitle().'</title>';

しかし、__get & __set方法はかなり迅速に大きくて扱いにくくなることができ、かつ明示的に適切&をコーディングするとき、それは呼ばれている明確な関数を作るために、明示的なset/getX()の方法を使用するためのより良い私の意見であり、そして。コードの冗長さの僅かな増加は、私が容易に見ることができるように実際に関数を呼び出すものとそうでないもの。例外は、別のクラス/オブジェクトのデコレータを構築するときですが、それはそれです。

1

ゲッターとセッターのメソッドとの違いはほとんどありません。__set()__get()メソッドです!これらは魔法です! __set()オブジェクトに未定義状態を割り当てたい場合に使用します。したがって、__get()も未定義状態の値を取得するために使用します。 定義済み状態の値の割り当てまたは取得にsetterとgetterを使用

2

__get()の唯一の利点は、コードが少なくなる可能性がありますが、必ずしもそうであるとは限りません。たとえば、プライベートメンバーが10人で、ゲッターに5を表示させたい場合は、__get()と書かなければなりません。そうすれば偽りの目に見えるメンバーの1人が呼び出されると、それを送信できます。そうでなければ、そうでなければ__get()せずに自然に来る(エラーを発行したり、実際に有用ではないかもしれないnullなどの値を返す。

私は全く一般的にはゲッターとセッターを使用することを提案している人をexcoriateしなければならない。これは通常のいずれかアーキテクチャに問題があることを示し、例えば、次の二つのコードブロック間の概念的な違いを説明:。

class _ { 
    private $_; 
    public function get_() { 
     return $this->_; 
    } 
} 

class _ { 
    public $_; 
} 

対はdiffereがありませんnce。

しかし、多くの人がgetterを使う利点は、何らかの方法で戻り値を変更して受信者に役立てることができるということです。しかし、私たちは建築の問題に戻ります。何らかの理由でクラスの内容を公開する必要はありません。代わりに、クラスにアクションを実行するように指示する必要があります(アクションの状態によって異なる場合があります)。ゲッターを使用すると、一般に、クラスの状態を照会し、その状態に基づいて外部的にアクションを実行することができます。

私は__set()とセッターに対して本質的に同じ引数を持っていますが、__set()はあなたが行うことができますことを1つの素敵なものがある:

class _ { 
    private $_ = array(); 
    public function __set($key, $val) { 
     $this->_[$key] = $val; 
    } 
} 

これは、あなたが$_obj->key = 'val'非常に素晴らしいを入力することができますが。これと大きな違いはなく、キーと値をとり、同じことをするadd()のような別のメソッドを追加することに注意してください。私はオブジェクトセッターの表記を好むだけです。

0

従来のgetX()/ setX()メソッドの代わりに、魔法のgetterとsetterメソッドを使用する利点はありますか? PHPをコーディングするときにそれらを使用する必要がありますか?

書き込むコードが少なくて済むので、それを使用する強い理由があります。属性ごとのgetX()/ SETXを()書くとき
その他の理由あなたはすべてのあなたのgetter/setterメソッドに共通の動作を追加することができるということです

function __set() { 
    //> Do some code in common between all setter 

    //> set your var here 
} 
0

は、実質的に言えば、あなたは最低でもあるでしょう、 7行のコード。これは、開きメソッドの中括弧が定義と同じ行にあることを前提としており、メソッドに単一行のコードを置くだけで、それ自身の行に閉じる中括弧があります。

些細でないオブジェクトの場合は、それに6を掛けます(YMMV)。これは、属性アクセス/突然変異のためだけに42行です。それはではありません。には、入力の検証または正規化が含まれています。代わりに、チェックアウト:https://github.com/metaphp/attributes

0

動的プログラミング(例えば、魔法を使用)にはオーバーヘッドがあります。古いベンチマーク:Benchmarking magic

PHPは動的な(とない完全企業)の言語であるため、コード行を削減し、いくつかのナノ秒を逃すことはエラーとなどを減らすこと、多く例(デバッグのため、拡張性に優れたアイデアと思われます)。

関連する問題