ベストプラクティス: PHP マジックメソッド __set と __get [重複] 質問する

ベストプラクティス: PHP マジックメソッド __set と __get [重複] 質問する

重複の可能性あり:
マジックメソッドは 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 では、@propertyphpdoc アノテーションで処理できますが、メンテナンスが必要になり、非常に面倒です)
  • ドキュメンテーション(phpdoc) は、コードの使用方法と一致しておらず、クラスを見てもあまり答えが得られません。これは混乱を招きます。
  • 編集後に追加: プロパティのゲッターを持つことは「実際の」方法とより一致しているwheregetXXX()はプライベート プロパティを返すだけでなく、実際のロジックを実行します。命名は同じです。たとえば、$user->getName()(プライベート プロパティを返す) と$user->getToken($key)(計算済み) があります。ゲッターがゲッター以上を取得し、何らかのロジックを実行する必要がある日でも、すべてが一貫しています。

最後に、これが私の考えでは最大の問題です。これは魔法だ魔法というのは、非常に悪いものです。なぜなら、魔法を正しく使うには、その仕組みを知らなければならないからです。これは私がチームで遭遇した問題です。あなただけではなく、全員が魔法を理解しなければならないのです。

ゲッターとセッターを書くのは面倒ですが(私は嫌いです)、書く価値はあります。

おすすめ記事