パブリックプロパティ、ゲッターおよびセッターまたはマジックメソッド?

原則として、PHPクラスでパブリックプロパティを使用することをお勧めするか、ゲッターとセッターを使用する(およびプロパティをプライベートまたは保護する)価値があるかについて意見は一致しません。 別の妥協案は、魔法のメソッド__get()および__set()を使用することです。
それぞれのアプローチには長所と短所があります。それらを見てみましょう...


パブリックプロパティの使用例:
 class Foo { public $bar; } $foo = new Foo(); $foo->bar = 1; $foo->bar++; 

この例では、 barFooクラスのパブリックプロパティです。 このアプローチを使用すると、このプロパティを好きなように操作して、任意のデータを保存できます。

公共財産の利点

パブリックプロパティのデメリット


ゲッターとセッターの使用例:
 class Foo { private $bar; public function getBar() { return $this->bar; } public function setBar($bar) { $this->bar = $bar; } } $foo = new Foo(); $foo->setBar(1); $foo->setBar($foo->getBar() + 1); 

ここのbarプロパティはプライベートです。この点で、直接アクセスすることはできません。 プロパティの値を取得するには、 getBarまたはsetBarを使用してプロパティに値を割り当てる必要があります。 入力データが完全に正しいことを確認できるように、これらのメソッドには検証に適切な機能が含まれている場合があります。

ゲッターとセッターの利点

ゲッターとセッターの欠点


マジックゲッターとセッターの使用例:
 class Foo { protected $bar; public function __get($property) { switch ($property) { case 'bar': return $this->bar; //etc. } } public function __set($property, $value) { switch ($property) { case 'bar': $this->bar = $value; break; //etc. } } } $foo = new Foo(); $foo->bar = 1; $foo->bar++; 

この場合、 barプロパティはパブリックではありませんが、コードではまるでパブリックであるかのように使用されます。 PHPは、対応するパブリックプロパティを見つけることができない場合、対応するマジックメソッド( __get()値を取得し、 __set()値を設定します)を__set()ます。 このアプローチは妥協点のように思えるかもしれませんが、重大な欠点があります(以下の欠点をご覧ください!)。 __get()および__set()メソッドはパブリックプロパティに対して呼び出されず、プロパティがprotectedまたはprivateとしてマークさprotected 、スコープ外にある場合、またはプロパティが定義されていない場合に__get()れることにも注意して__get()

マジックゲッターとセッターの利点

魔法のゲッターとセッターの欠点


使用するアプローチ
明らかに、ゲッターとセッターには多くの重要な利点があり、一部の人々はそれらを常に使用すべきだと考えています(特にJavaバックグラウンドを持つ人!)。 しかし、私の意見では、これは言語の自然な発展に違反し、その過度の複雑さと詳細は、たとえそれが必要ではない場合でも、私と一緒に働くことを余儀なくさせます(普通のゲッターとセッターがプロパティを取得して設定するだけで何もしない場合、私を悩ませます)。 そのような場合、パブリックプロパティを使用しようとします。より厳密に制御する必要がある重要なプロパティ、または遅延データの読み込みを使用する必要がある場合は、ゲッターとセッターを使用します。

他の選択肢?
PHPを学習する前に、C#を使用しました。 C#では、すべてのプロパティにアクセスメソッドがありますが、メソッドとして呼び出す必要はありません。プロパティを直接操作すると、対応するメソッドが魔法のように呼び出されます。 これは、PHPのマジックメソッド__get()および__set()に多少似ていますが、プロパティは定義されたままで、アクセス可能です。 これは黄金の意味であり、PHPで同様の機会が見られることは非常に良いことです。

悲しいことに、プロパティアクセスメソッドを定義するための同様の構文でC#を実装する必要があるRFCは、必要な票の3分の2を獲得しませんでした: wiki.php.net/rfc/propertygetsetsyntax-v1.2それだけです!

Source: https://habr.com/ru/post/J197332/


All Articles