StrictPhp, 基于AOP的严格类型检查

分享于 

8分钟阅读

GitHub

  繁體 雙語
AOP-based strict type checks for PHP
  • 源代码名称:StrictPhp
  • 源代码网址:http://www.github.com/Roave/StrictPhp
  • StrictPhp源代码文档
  • StrictPhp源代码下载
  • Git URL:
    git://www.github.com/Roave/StrictPhp.git
    Git Clone代码到本地:
    git clone http://www.github.com/Roave/StrictPhp
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Roave/StrictPhp
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    StrictPhp

    Build StatusScrutinizer Code QualityCode Coverage

    StrictPhp是一个开发工具,旨在为PHP应用程序和库带来更严格的运行时断言。

    作者

    安装

    $ composer require roave/strict-php

    请注意,当前版本具有不稳定的依赖关系。

    要安装这些依赖项,你可以在你的composer.json 中设置 "minimum-stability":

    {
     "minimum-stability": "dev"}

    用法

    安装 StrictPhp 之后,通过以下代码将它的指向要在运行时( 你正在编写的代码) 中检查的目录:

    StrictPhpStrictPhpKernel::bootstrap(['debug'=>true,// change this if you use this tool on multiple projects:'cacheDir'=>sys_get_temp_dir(),'includePaths'=> [__DIR__.'/path/to/your/sources', ],]);

    然后StrictPhp将拦截任何被认为是"非法"的运行时操作,并抛出异常或者catchable致命错误。

    请记住在之前执行这里代码任何可能自动加载的类的代码。

    配置

    通过将一组选项传递给go-aop-php插件和一组功能标志,可以初始化该 StrictPhpStrictPhpKernel:

    • StrictPhpStrictPhpKernel::CHECK_STATE_AFTER_CONSTRUCTOR_CALL
    • StrictPhpStrictPhpKernel::JAIL_PUBLIC_METHOD_PARAMETERS
    • StrictPhpStrictPhpKernel::CHECK_STATE_AFTER_PUBLIC_METHOD_CALL
    • StrictPhpStrictPhpKernel::CHECK_PUBLIC_METHOD_PARAMETER_TYPE
    • StrictPhpStrictPhpKernel::CHECK_PUBLIC_METHOD_RETURN_TYPE
    • StrictPhpStrictPhpKernel::CHECK_PROPERTY_WRITE_IMMUTABILITY
    • StrictPhpStrictPhpKernel::CHECK_PROPERTY_WRITE_TYPE

    下面描述了这些特性中的。

    特性

    StrictPhp 目前支持以下功能:

    每个属性类型检查

    通过标志启用 StrictPhpStrictPhpKernel::CHECK_PROPERTY_WRITE_TYPE

    这里特性将阻止应用程序将非法值分配给类型为( 通过 docblock )的属性。 作为一个示例,考虑以下类:

    classExample{/** * @var int|null*/public$integer;}

    下面的代码将工作:

    $object=newExample();$object->integer=123;

    以下代码将崩溃:

    $object=newExample();$object->integer='123';

    请注意,这种特性目前只适用于 public 和 protected 属性。

    返回类型检查

    上述功能非常类似,这里功能将阻止你的应用程序从类型为的方法中返回非法值的方法。 作为示例,请考虑以下方法:

    classExample{/** * @return string*/publicfunctiondummyReturn($value) {return$value; }}

    下面的代码将工作:

    (newExample())->dummyReturn('string');

    以下代码将崩溃:

    (newExample())->dummyReturn(123);

    请注意,这种特性目前只适用于 public 和 protected 方法。

    不可变属性

    通过标志启用 StrictPhpStrictPhpKernel::CHECK_PROPERTY_WRITE_IMMUTABILITY

    这里功能将阻止应用程序覆盖标记为 @immutable的对象属性。 作为一个示例,考虑以下类:

    classExample{/** * @immutable*/public$immutableProperty;}

    以下代码将崩溃:

    $object=newExample();$object->immutableProperty='a value';echo'Works till here!';$object->immutableProperty='another value'; // crash

    请注意,这种特性目前只适用于 public 和 protected 属性。

    public-构造函数属性初始化检查

    通过标志启用 StrictPhpStrictPhpKernel::CHECK_STATE_AFTER_CONSTRUCTOR_CALL

    这个StrictPhp特性允许检查类的public 构造函数是否完全初始化了对象。

    以下代码将使StrictPhp崩溃你的应用程序:

    classExample{/** * @var array*/private$arrayProperty;publicfunction__construct() { }}

    为了使这里代码工作,你必须使用 @var array|null 注释 $arrayProperty,或者使构造函数正确地初始化属性:

    classExample{/** * @var array*/private$arrayProperty;publicfunction__construct() {$this->arrayProperty= ['initial status']; }}
    参数接口 jailing

    通过标志启用 StrictPhpStrictPhpKernel::JAIL_PUBLIC_METHOD_PARAMETERS

    这种 StrictPhp"jail"( 限制)的特性在接口作为类型提示时调用非接口方法。

    下面的示例将工作,但如果启用了 StrictPhp,则会崩溃:

    interfaceHornInterface{publicfunctionhonk();}classTheUsualHornimplementsHornInterface{publicfunctionhonk() { var_dump('honk'); }publicfunctionsadTrombone() { var_dump('pooapooapooapoaaaa'); }}classCar{publicfunctionhonk(HornInterface$horn, $sad=false) {if ($sad) {// method not covered by interface: crash$horn->sadTrombone();return; }// interface respected$horn->honk(); }}
    $car=newCar();$horn=newTheUsualHorn();$car->honk($horn, false); // works$car->honk($horn, true); // crashes

    这样可以防止api使用的api根据非api方法设计代码。

    参数检查

    通过标志启用 StrictPhpStrictPhpKernel::CHECK_PUBLIC_METHOD_PARAMETER_TYPE

    StrictPhp还提供了在 public 方法调用过程中更详细地检查参数类型的方法。

    具体而言,下面的代码将在PHP中工作:

    finalclassInvoice{/** * @param LineItem[] $lineItems*/publicfunction__construct(array$lineItems) {//.. . }}$invoice=newInvoice(['foo', 'bar']);

    由于 $lineItems ( 它应该是 LineItem 对象的集合) 中的类型不匹配,这里代码将在StrictPhp中崩溃。

    当前限制

    这个软件包使用巫术魔法操作,特别是 go-aop-php。

    has在获取对 private 类成员的访问时有一些限制,所以请注意它有限的范围( for )。

    这里软件包只针对autoloaded类工作;不能由自动装载程序处理的类不能被StrictPhp纠正。

    许可证

    这个软件包是在 MIT许可协议下发布的。

    如果你希望贡献项目,请阅读贡献说明。


    BASE  PHP  str  type  AOP  严格  
    相关文章