5

同じリクエスト全体で状態を維持するライブラリ クラスが必要です。私のユースケースは、「メッセージ」をクラスに渡し、ビューからいつでも呼び出すことです。アプリケーションのどの部分からでもメッセージを追加できます。

私はもともと静的メソッドを介してこれを行っていましたが、うまくいきました。ただし、ライブラリの一部として、静的クラスでは実行できない__constructandも呼び出す必要があります。__destruct()

これが私がやろうとしていることの非常に簡単な例です:

class Messages
{
  private static $messages = array();

  public function __construct()
  {
    // do something
  }

  public function __destruct()
  {
    // do something else
  }

  public static function add($message)
  {
    self::$messages[] = $message;
  }
  public static function get()
  {
    return self::$messages;
  }
}

次に、次のようにして、コードの任意の場所にメッセージを追加できます

Messages::add('a new message');

可能な限り static の使用を避けたい (テスト可能性)。私はDIを見てきましたが、何かが欠けていない限り、適切ではないようです。

代わりにクラス (非静的) を作成することもできますが、すべてのメッセージが同じオブジェクトに書き込まれるようにするにはどうすればよいでしょうか。

これに取り組む最善の方法は何ですか?

4

5 に答える 5

3

Singleton パターンを使用することでメリットが得られるようです。これは、リクエスト全体でインスタンスを 1 つだけ持つ必要があるオブジェクト用に設計されています。基本的に、プライベート コンストラクターと静的メソッドを作成して、唯一のインスタンスを取得します。これは、あなたが説明したことを行うシングルトンの例です。

<?php
class Messages
{
    private static $_instance;
    private $_messages = array();

    private function __construct() {
        // Initialize
    }

    static public function instance() {
        if (! self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function add_message( $msg ) {
        $this->_messages[] = $message;
    }

    public function get_messages() {
        return $this->_messages;
    }

    private function __destruct() {
        // Tear-down
    }
}

$my_messages = Messages::instance();
$my_messages->add_message( 'How now, brown cow?' );
// ...
$your_messages = Messages::instance();
$msgs = $your_messages->get_messages();
echo $your_messages[0]; // Prints, "How now, brown cow?"

Messagesコンストラクターはプライベートであるため、オブジェクト自体のメソッド内からのみオブジェクトを作成できます。静的メソッドがあるので、そこから新しいインスタンスをinstance()作成できます。Messagesただし、インスタンスが既に存在する場合は、そのインスタンスを返す必要があります。

基本的に、シングルトンは自身のインスタンスのゲートキーパーであり、自身の複数のインスタンスが存在することを頑固に拒否します。

于 2012-09-07T16:46:25.243 に答える
1

シングルトンクラスにしてみませんか?

class Messages
{
    // singleton instance of Messages
    private static $instance;

    public function __construct() { ... }

    public static function getInstance()
    {
        if (!self::$instance)
        {
            self::$instance = new Messages();
        }

        return self::$instance;
    }
}

これにより、すべてのメッセージが同じオブジェクトに書き込まれるように__constructなり、__destruct

于 2012-09-07T16:41:30.300 に答える
1

シングルトンクラスをやりたいと思っているようです。これにより、あるクラスにインスタンスが作成され、別のクラスの同じインスタンスにアクセスできるようになります。詳細については、 http://www.developertutorials.com/tutorials/php/php-singleton-design-pattern-050729-1050/をご覧ください。

于 2012-09-07T16:39:37.743 に答える
0

シングルトンが必要なように聞こえますが、アンチパターンとして避けたいと思います。

self::_isBuilt();すべての静的メンバーがメソッドを呼び出して構成要素を実行する完全な静的クラスを実行できます。Destruct は少しトリッキーです。

あなたのニーズに最適なケースは、すぐに構築してからグローバルからアクセスする通常の(非静的)クラスかもしれません...非常にきれいではありませんが、構築/破棄とメンバー、および使用できる静的を許可$thisします役に立った。グローバル変数が気に入らない場合は、メソッドでラップすることもできます (JS でかなり使用されているトリック) が、実際にはあまりきれいではありません。

通常のグローバル クラスとして:

$myClass=new myClass();
//Access anywhere as:
globals['myClass']->myFunction(..);

関数にラップ

function my_class() {
 static $var=null;
 if ($var===null) $var=new myClass();
 return $var;
}
//Access anywhere as:
my_class()->myFunction(..);
于 2012-09-07T16:45:15.033 に答える
0

必要なのはSingletonパターンです:

final class Singleton {
    // static variable to store the instance
    private static $instance = NULL;

    // disable normal class constructing
    private function __construct() {}

    // instead of using the normal way to construct the class you'll use this method
    public static function getInstance() {
       if (NULL === self::$instance) {
           self::$instance = new self;
       }
       return self::$instance;
    }
    // disable external cloning of the object
    private function __clone() {}
}

// get the instance across some of your scripts
$singleton = Singleton::getInstance();
于 2012-09-07T16:39:39.983 に答える