2

私は最近、オブジェクトのインスタンス化、オブジェクトといくつかのデータのオブジェクト プロパティへの割り当て、そして何かを行うためにメソッドの呼び出しを実行するコードを書きました。

しかし、コードをループで実行すると、機能せず、その理由がわかりませんでした。私のサンプル コードは次のとおりです。

コントローラー機能:-

$arrayOfObjects = SomeClass::getItems();
foreach ($arrayOfObjects as $object) {
    SomeOtherObject::getInstance($object, time())->run();
}

SomeOtherObject::getInstance() :-

public static function getInstance($object, $timestamp) {
    if (!(self::$_instance instanceof self)) {
        self::$_instance = new self($object, $timestamp);
    }
    return self::$_instance;
}

private function __contruct($object, $timestamp) {
    $this->_theObjectPassed = $object;
    $this->_theTimestampPassed = $timestamp;
}

私を困惑させたのは、SomeOtherObject の run メソッドが期待どおりに動作していなかったことです。ループ内にデバッグを追加すると、つまり $object で getName() メソッドを出力すると、ループ内の各アイテムに対して同じものが得られました。

オブジェクトを構築する方法を(getInstance()の代わりに)次のように変更すると、機能しました:-

$someOtherObject = new SomeOtherObject($object, time());
$someOtherObject->run();

getInstance メソッドの動作とチェック方法に関係があると思いますが、誰かが説明できるかどうか疑問に思いました。

ありがとう

4

1 に答える 1

2

静的変数を誤解しているようです。静的変数は、オブジェクトごとではなく、クラスごとに 1 回作成/初期化されます。

getInstance()$_instance が初期化されていない場合、 if ステートメントは最初に呼び出されたときにのみ真になります。次に、SomeOtherObject の新しいインスタンスへの参照が割り当てられます。

以降のすべての呼び出しで、if は false を返し、新しい $_instance を作成する代わりに既存の $_instance が返されます。

getInstance() メソッドから if ステートメントを削除します。

public static function getInstance($object, $timestamp) {
    return new self($object, $timestamp);
}
于 2013-01-04T21:47:33.643 に答える