4

PHPUnit を使用して、テスト用のモック クラスを作成しています。

class Item extends Object {
  protected static $_cache;
}

私はモックがこのようなことをすることを確信しています(私が間違っている場合は修正してください):

class Mock_Item_randomstring extends Item {

}

myItemのキャッシュが読み込まれると、渡されたオブジェクトが のインスタンスであることを確認しますItem。モックは を明示的に定義$_cacheしていないため、インスタンス タイプのチェックに失敗します。

PHP は、実際にはリフレクション関数をまったく文書化していません。クラスがなるように、事後に静的変数を設定する方法はありますか

class Mock_Item_randomstring extends Item {
  protected static $_cache;
}

編集

リフレクション メソッドをいじってみたところ、さまざまな問題に遭遇しました。ここに私が混乱しているものがあります:

$mock = $this->getMock( 'Item', array( '_func' ), array(
  $argument1, $argument2
));

$mock = new ReflectionClass($mock); 


$mock->staticExpects( $this->exactly(2) )->method( '_func' );

私は、リフレクションがクラス全体をコピーすると仮定していました。次のエラーが表示されます。 Call to undefined method ReflectionClass::staticExpects()

4

2 に答える 2

0

私は、サブクラスのクラスごとの静的変数に対して、やや厄介なトリックを使用する傾向があります。

class A {
    protected static $cache;
    public static function getCache() {
        return static::$cache;
    }
    public static function setCache($val) {
        static::$cache = & $val; // note the '&'
    }
}
class B extends A {}

A::setCache('A');
B::setCache('B');
A::getCache(); // 'A'
B::getCache(); // 'B'

もちろん、最初から static 変数を避けるのが最善です。専用のキャッシュ オブジェクトを使用し、クラスのインスタンス化時に挿入します。

于 2012-05-10T21:08:30.837 に答える
0

その必要はありません。\Closure::bindプライベートおよび保護された静的プロパティを読み取って割り当てることができます。http://www.php.net/manual/en/closure.bind.phpのサンプル コードを参照してください。

于 2012-05-11T00:44:45.950 に答える