gmazzap/andrew

代理对象用于访问(动态和静态)私有属性和方法。

2.1.0 2017-03-12 15:28 UTC

This package is auto-updated.

Last update: 2024-08-26 14:35:19 UTC


README

代理对象用于访问(动态和静态)私有属性和方法。

travis-ci status codecov.io license

是什么

Andrew 允许访问(读取和写入)任何对象的私有属性和方法。

它提供了2个"代理"对象,一个用于动态属性和方法,另一个用于静态属性和方法。

代理

假设以下类

class Subject
{
  private $var = 'I am private';
  
  public function getVar() {
      return $this->var;
  }
  
  public function hasVar() {
      return isset($this->var);
  }
  
  private function testMe() {
      return 'I am private';
  }
}

使用 Andrew 可以

$subject = new Subject();

$proxy = new Andrew\Proxy($subject);

// get subject private var via proxy
echo $proxy->var; // 'I am private'

// set subject private var via proxy
$proxy->var = 'I WAS private';
echo $subject->getVar(); // 'I WAS private'

// check subject private var is set via proxy
isset($proxy->var); // true

// unset subject private var via proxy
unset($proxy->var);
$subject->hasVar(); // false

// call subject private method via proxy
echo $proxy->testMe() // 'I am private'

示例 Subject 类具有公共的获取器和设置器,用于其私有变量,我们添加它是为了测试目的,但 Andrew 代理当然在类没有提供这种可能性时更有用。

静态代理

假设以下类

class Subject
{
    private static $var = 'I am private static';
  
    public static function getVar() {
        return self::$var;
    }
  
    private static function testMe() {
        return 'I am private static';
    }
}

使用 Andrew 可以

$proxy = new Andrew\StaticProxy(Subject::class); // we pass class name, not object

// getter
echo $proxy->var; // 'I am private static'

// setter
$proxy->var = 'I WAS private static';
echo Subject::getVar(); // 'I WAS private static'

// isser
isset($proxy->var); // true

// caller
echo $proxy->testMe() // 'I am private static'

请注意,StaticProxy 没有 未设置器,因为 PHP 不允许取消静态变量的设置

如果你尝试在 StaticProxy 对象上取消设置任何内容,Andrew 将抛出异常。

异常

Andrew 抛出了几个异常。所有这些异常都在命名空间 Andrew\Exception 中。

它们是

  • 当使用无效类型的参数时抛出 ArgumentException。例如,当方法期望一个字符串但接收到一个数字或其他内容时。
  • 当方法期望一个类但接收到一个不是有效类名的字符串时抛出 ClassException
  • 当尝试访问不存在的变量时抛出 PropertyException,或者当尝试使用 Proxy 访问静态变量或使用 StaticProxy 访问非静态属性时。
  • 当尝试访问不存在的函数,或者当尝试使用 Proxy 访问静态函数或使用 StaticProxy 访问非静态函数时抛出 MethodException
  • 当尝试取消静态变量时抛出 RuntimeException

安装

通过 Composer 安装,包名为 "gmazzap/andrew",并在 Packagist 上可用。

我应该在生产环境中使用这个吗?

不。但在单元测试中可能非常有用。

需求

Andrew 没有依赖。需要 PHP 5.6+,与 PHP 7 和 7.1 兼容。

许可证

MIT