gmazzap / andrew
代理对象用于访问(动态和静态)私有属性和方法。
2.1.0
2017-03-12 15:28 UTC
Requires
- php: >=5.6
Requires (Dev)
- phpunit/phpunit: 5.7.*
This package is auto-updated.
Last update: 2024-08-26 14:35:19 UTC
README
代理对象用于访问(动态和静态)私有属性和方法。
是什么
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