1

ここでの私の選択の中で、意味的および技術的に最も最適なものはどれか疑問に思います。単純なオブジェクトレジストリクラスを作成しましたが、オブジェクトアクセスのメソッドでは、何が最適か疑問に思います。私は現在最初のバリエーションを使用しています:

//the Registry methods can chain, each returning a self reference
$registry = Registry::getInstance()->register('myObject', new Object);

//accessing a registered object method
//in various possible ways
Registry::getInstance()->myObject->method();        //1
Registry::getInstance()->use('myObject')->method(); //2
$registry('myObject')->method();                    //3
  • 最初のバリエーションは__get()、流暢な構文を維持しながら、魔法を使用します。
  • 2番目は' getter 'メソッドを使用しuse()ます。
  • 3つ目は__invoke()、提案されている魔法を使用しますが、私はあまり好きではありません。

誰かがこれらのオプションのいずれか(またはまったく)を使用することについての洞察または提案を持っているかどうかを知りたいだけです。私の場合、Registryクラスを使用する理由は、ネストされたクロージャで使用するために、キーオブジェクトの疑似グローバリゼーションを提供するためです(use毎回宣言するのは面倒です)

これは、 PHPクロージャと暗黙のグローバル変数スコープで、私の他の質問にいくらか関連しています。

前もって感謝します :)

4

1 に答える 1

1

私の個人的な意見は、2番目と3番目のコード例を組み合わせて使用​​することです。両方(または2番目の例のみ)を使用すると、phpDocを使用してオートコンプリートを維持できます。

次に例を示します。

<?php

class Session {
    public function register() {
    }
}

/**
 * @property Session $session
 */
class Registry {
    private $_classes = array();

    public function __set($key, $value) {
        $key = (string) $key;
        if ((null === $value) && isset($this->_classes[$key])) {
            unset($this->_classes[$key]);
        } elseif (null !== $value) {
            $this->_classes[$key] = $value;
        }
    }

    public function __get($key) {
        $key = (string) $key;
        if (isset($this->_classes[$key])) {
            return $this->_classes[$key];
        }

        switch ($key) {
            case 'session':
                $this->_classes[$key] = new Session();
                break;
        }

        return $this->_classes[$key];
    }
}

$registry = new Registry();
$registry->session->register();

レジストリクラスがシングルトンパターンに従わない理由のヒントを提供する必要がある場合...単体テストを実行する場合は、シングルトンパターンの使用を避けてください。ここを参照してください:http ://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

于 2011-07-25T08:57:04.967 に答える