eloquent/liberator

此包已被弃用且不再维护。未建议替代包。

绕过PHP访问修饰符限制的代理。

3.0.0 2022-02-21 08:11 UTC

This package is auto-updated.

Last update: 2023-08-08 04:01:59 UTC


README

不再维护

此包不再维护。更多信息请参阅 此声明

Liberator

绕过PHP访问修饰符限制的代理。

安装和文档

什么是Liberator?

Liberator 允许以标记为 public 的方式访问对象的 protectedprivate 方法和方法属性。它可以对对象和类(即静态方法和属性)都这么做。

Liberator 的主要用途是作为测试工具,允许直接访问那些在其他情况下需要复杂测试框架或模拟来测试的方法。

使用方法

对于对象

以下是一个类

class SeriousBusiness
{
    private function foo($adjective)
    {
        return 'foo is ' . $adjective;
    }

    private $bar = 'mind';
}

通常无法从 SeriousBusiness 类外部调用 foo() 或访问 $bar,但 Liberator 允许这样做

use Eloquent\Liberator\Liberator;

$object = new SeriousBusiness;
$liberator = Liberator::liberate($object);

echo $liberator->foo('not so private...'); // outputs 'foo is not so private...'
echo $liberator->bar . ' = blown';         // outputs 'mind = blown'

对于类

相同的概念适用于静态方法和属性

class SeriousBusiness
{
    static private function baz($adjective)
    {
        return 'baz is ' . $adjective;
    }

    static private $qux = 'mind';
}

要访问这些,必须使用 class liberator 而不是 object liberator,但它们的操作方式类似

use Eloquent\Liberator\Liberator;

$liberator = Liberator::liberateClass('SeriousBusiness');

echo $liberator->baz('not so private...'); // outputs 'baz is not so private...'
echo $liberator->qux . ' = blown';         // outputs 'mind = blown'

或者,Liberator 可以生成一个可以静态使用的类

use Eloquent\Liberator\Liberator;

$liberatorClass = Liberator::liberateClassStatic('SeriousBusiness');

echo $liberatorClass::baz('not so private...');      // outputs 'baz is not so private...'
echo $liberatorClass::liberator()->qux . ' = blown'; // outputs 'mind = blown'

不幸的是,PHP 中目前没有 __getStatic() 或 __setStatic(),因此以这种方式访问静态属性不如理想中的优雅。

Liberator 的应用

  • 编写 白盒 风格的单元测试(测试受保护的/private 方法)。
  • 修改设计不良的第三方库的行为。