重複の可能性あり:
マジックメソッドは PHP におけるベストプラクティスですか?
これらは単純な例ですが、クラスに 2 つ以上のプロパティがあると想像してください。
ベストプラクティスは何でしょうか?
a) __get と __set を使用する
class MyClass {
private $firstField;
private $secondField;
public function __get($property) {
if (property_exists($this, $property)) {
return $this->$property;
}
}
public function __set($property, $value) {
if (property_exists($this, $property)) {
$this->$property = $value;
}
}
}
$myClass = new MyClass();
$myClass->firstField = "This is a foo line";
$myClass->secondField = "This is a bar line";
echo $myClass->firstField;
echo $myClass->secondField;
/* Output:
This is a foo line
This is a bar line
*/
b) 従来のセッターとゲッターの使用
class MyClass {
private $firstField;
private $secondField;
public function getFirstField() {
return $this->firstField;
}
public function setFirstField($firstField) {
$this->firstField = $firstField;
}
public function getSecondField() {
return $this->secondField;
}
public function setSecondField($secondField) {
$this->secondField = $secondField;
}
}
$myClass = new MyClass();
$myClass->setFirstField("This is a foo line");
$myClass->setSecondField("This is a bar line");
echo $myClass->getFirstField();
echo $myClass->getSecondField();
/* Output:
This is a foo line
This is a bar line
*/
記事上で:http://blog.webspecies.co.uk/2011-05-23/the-new-era-of-php-frameworks.html
著者は、魔法の方法を使うのは良い考えではないと主張しています。
まず、当時は PHP のマジック関数 (__get、__call など) を使うのが流行っていました。一見すると何も悪いことはないのですが、実際には非常に危険です。API が不明瞭になり、自動補完が不可能になり、最も重要なのは速度が遅いことです。マジック関数の使用例は、PHP をハッキングして、望まないことを実行することでした。そして、それはうまくいきました。しかし、悪いことも起こりました。
しかし、これについてもっと意見を聞きたいです。
ベストアンサー1
私も過去にあなたと同じ状況に陥ったことがあります。そして魔法のような方法を試しました。
これは間違いでした。質問の最後の部分がすべてを物語っています。
- これはもっとゆっくり(ゲッター/セッターより)
- がある自動補完なし(そしてこれは実際には大きな問題です)、そしてタイプ管理リファクタリングとコードブラウジングのための IDE による処理 (Zend Studio/PhpStorm では、
@property
phpdoc アノテーションで処理できますが、メンテナンスが必要になり、非常に面倒です) - のドキュメンテーション(phpdoc) は、コードの使用方法と一致しておらず、クラスを見てもあまり答えが得られません。これは混乱を招きます。
- 編集後に追加: プロパティのゲッターを持つことは「実際の」方法とより一致しているwhere
getXXX()
はプライベート プロパティを返すだけでなく、実際のロジックを実行します。命名は同じです。たとえば、$user->getName()
(プライベート プロパティを返す) と$user->getToken($key)
(計算済み) があります。ゲッターがゲッター以上を取得し、何らかのロジックを実行する必要がある日でも、すべてが一貫しています。
最後に、これが私の考えでは最大の問題です。これは魔法だ魔法というのは、非常に悪いものです。なぜなら、魔法を正しく使うには、その仕組みを知らなければならないからです。これは私がチームで遭遇した問題です。あなただけではなく、全員が魔法を理解しなければならないのです。
ゲッターとセッターを書くのは面倒ですが(私は嫌いです)、書く価値はあります。