我如何使用PHP反射来设置一个静态属性?(How can I use PHP reflection

2019-09-17 03:44发布

我使用的PHPUnit使用于测试的模拟类。

class Item extends Object {
  protected static $_cache;
}

我很肯定的嘲弄做这样的事情(请纠正我,如果我错了):

class Mock_Item_randomstring extends Item {

}

当我的Item的缓存被填充,它的检查,看看是正在传递的对象是一个实例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()

Answer 1:

我倾向于使用有点讨厌的把戏在子类中每个类的静态变量:

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'

当然,这是最好的,以避免在首位的静态变量。 使用专用高速缓存对象,当类被实例化注入它。



Answer 2:

你不必。 \Closure::bind ,您可以阅读和分配private和protected静态属性。 查看示例代码http://www.php.net/manual/en/closure.bind.php



文章来源: How can I use PHP reflection to set a static property?
标签: php phpunit