Menu

059. Laravel 静态代码分析工具——nunomaduro/larastan

Laravel 静态代码分析工具——nunomaduro/larastan

PHPStan 是一个 PHP 代码静态分析命令行工具,因为 PHP 没有编译的过程,只有当程序真正执行报错了,才会意识到代码出了问题,例如我们的某个变量没有定义,某个类命名空间错了,没有找到等等。我们也需要花费很多时间修正这样的错误。PHPStan 就相当于其他语言编译器的角色,提前找出代码中的错误,让我们及时的修改。

这里有一篇详细的文章介绍了 PHPStan https://learnku.com/laravel/t/19011

在 Laravel 中使用 PHPStan 会更加的方便,也就是我们今天要介绍的这个扩展包 nunomaduro/larastan ,安装这个扩展包,然后调用 artisan 命令就可以对代码进行静态分析了,不过扩展包要求 Laravel 的版本大于等于 5.6,这节课我们在一个 5.7 的新项目中测试一下。

安装

创建一个新的分支,然后安装扩展包:

$ git checkout -b larastan
$ composer require --dev nunomaduro/larastan

file

使用

基础使用

扩展包提供了一个命令 code:analyse,默认情况下分析的是 app 目录,有一个分析等级,从 0 到 7 ,7 是最严格,默认情况先是 5。

file

因为是一个新的项目,所以没有错误。

测试错误代码

增加一些错误的代码试一下。

$ php artisan make:controller TestController

routes/web.php

.
.
.
Route::get('test', 'TestController@index');

app/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function index(Requet $request)
    {
        return $request->test($test);
    }
}

这里我们的 Request 写错了,写成了 Requet,然后我们调用了一个不存在的方法 test,传入了一个不存在的变量 $test

file

执行一下 code:analyse ,看到有三个错误:

  • Requet 类不存在;
  • 在一个不存在的对象上,调用 test 方法;
  • $test 变量不存在。

修正一下代码再来试一下,把 Requet 修改为 Request

app/Http/Controllers/TestController.php

.
.
.
    public function index(Request $request)
    {
        return $request->test($test);
    }
}

file

两个错误:

  • Request 类没有 test 方法;
  • $test 变量不存在。

将代码修改正确,然后再进行分析。

app/Http/Controllers/TestController.php

.
.
.
    public function index(Request $request)
    {
        $test = ['test'];
        return $request->only($test);
    }
}

file

测试类型限定及访问性

PHPStan 还能检测到很多错误,例如我们写一个类。

app/Foo.php

<?php

namespace App;

class Foo
{
    protected $foo = 'foo';
    public $bar = 'bar';

    public function test(String $test): array
    {
        return $test;
    }
}

定义了一个 protected 的属性 $foo,以及一个 public 的属性 $bar,test 方法有个小错误,要求返回数组,但是返回的是字符串。

app/Http/Controllers/TestController.php

.
.
.
use App\Foo;
.
.
.
    public function index(Request $request, Foo $foo)
    {
        $protected = $foo->foo;
        $public = $foo->bar;

        $foo->test(123);

        $test = ['test'];
        return $request->only($test);
    }
.
.
.

在 Controller 中调用一下这个类。

file

出现错误了:

  • test 方法需要返回数组;
  • 不能调用外部不可访问的属性;
  • test 方法需要传入字符串,但是我们传入了数字。

错误格式化

扩展包还支持我们格式化最后的错误信息,可以尝试一下:

php artisan code:analyse --error-format prettyJson

file

最后我们修正一下错误:

app/Foo.php

<?php

namespace App;

class Foo
{
    public $foo = 'foo';
    public $bar = 'bar';

    public function test(int $test): int
    {
        return $test;
    }
}

总结

PHPStan 是一个非常好用的工具,在我们把应用程序部署到生产环境前,提前帮助检测错误,减少了代码错误,我们的开发工作会更加的有效率。当然我们也可以将 PHPStan 与编辑器, git,持续集成等工具结合在一起,让代码变得更加的健壮。

代码版本控制

$ git add -A
$ git commit -m 'nunomaduro/larastan'

本文章首发在 Laravel China 社区
上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~
刻意练习,每日精进。
13
点赞
797
浏览
0
讨论
贡献者