2016-04-11 6 views
0

今日私はMVCに関するチュートリアルを読んでいました。このメンバはprivateメンバー値にアクセスするためにmagic-methods(__get & __set())を使用していました。 (LINK) 最初に私は__getと__setが何をするのか混乱しましたが、インターネットを読んだ後、私は最後に、このメソッドが、外部からアクセスできない場合に呼び出されることを発見しました。より簡単に理解するために、そのIMOの方法 - 私は私が推測する通常のゲッターとセッターを使用することができます__get()&__set()メソッドの意味

class Foo { 
    private $bar; 

    public __set($value) { 
     $this->bar = $value; 
    } 

    public __get() { 
     return $this->bar; 
    } 
}

を これまでのところ...

はしかし、それは、このようなコードを持ってしても意味がありません。

class Foo { 
    private $bar; 

    public setBar($value) { 
     $this->bar = $value; 
    } 

    public getBar() { 
     return $this->bar; 
    } 
}

__get & __setで外部のメンバーにアクセスしたい場合は、そのメンバーを公開することもできます。だから、私はそれをどうしたらいいのでしょうか? これらの2つの方法の意味は何ですか(私は例を挙げて)教えてもらえますか?

+0

あなたが提供したリンクの一例として、あなたが書いたものの近くに何かを見ないでください。彼は配列を使用しています、 '$ this-> vars [$ index] = $ value ; '。そのため、 '__set'と' __get'を使ってインデックス内のキーにアクセスするという意味はかなり合法です。または、アクセサごとにすべてのキーを書きたいと思いますか? – dbf

+0

それは本当ですが、私は別のチュートリアルでもこれを見てきました....そして、通常のgetterとsetterを使って配列を設定することもできますか? – Petschko

+0

私が書いたように、それを使うのは合法ですが、私はそれを使うのが賢明だとは言いませんでした;) – dbf

答えて

1

プログラムを開発すると、属性へのアクセスを制御する必要がないとみなされます。したがって、あなたは非公開ではなく公衆を置く。しかし、メンテナンスの際には、属性を0にすることを禁じるように、クラスを変更して制約を課す必要があることを認識しています。この変更を行うには、セッターを追加し、属性を非公開で使用する必要があります。結果:この変更をこのクラスのすべての顧客に適用するようになります。

最初からセッターとゲットゥールを使用していた場合、メンテナンスはずっと簡単になりました。

+0

これは単に後で変更するのを簡単にするためのものですか? - しかし、それらをあなたのprogrammを構築することはできません – Petschko

+1

オブジェクト指向プログラミングでは、クラスのメソッドとプロパティの可視性を指定できます。プロパティの場合は、値を監視せずに値を変更することが可能になるため、公開を許可することをお勧めします。 – Pierre

+1

カプセル化と呼ばれるGetterとSetterによるプロパティのアクセスを保護します。 オブジェクト指向プログラミングでは、カプセル化はオブジェクト内の情報を保護し、そのオブジェクトの操作方法のみを提案するアイデアです。したがって、オブジェクトに含まれる情報に関連するプロパティは、オブジェクトのメソッドによって提供/検証され、もはや外部ユーザの責任ではなくなります。外部ユーザーは、情報を直接変更することはできず、オブジェクトの動作特性を危険にさらす危険性があります。 – Pierre