059. Laravel 静态代码分析工具——nunomaduro/larastan
Laravel 静态代码分析工具——nunomaduro/larastan
PHPStan 是一个 PHP 代码静态分析命令行工具,因为 PHP 没有编译的过程,只有当程序真正执行报错了,才会意识到代码出了问题,例如我们的某个变量没有定义,某个类命名空间错了,没有找到等等。我们也需要花费很多时间修正这样的错误。PHPStan 就相当于其他语言编译器的角色,提前找出代码中的错误,让我们及时的修改。
这里有一篇详细的文章介绍了 PHPStan 翻译:PHPStan: PHP 静态代码分析工具介绍 。
在 Laravel 中使用 PHPStan 会更加的方便,也就是我们今天要介绍的这个扩展包 nunomaduro/larastan ,安装这个扩展包,然后调用 artisan 命令就可以对代码进行静态分析了,不过扩展包要求 Laravel 的版本大于等于 5.6
,这节课我们在一个 5.7
的新项目中测试一下。
安装
创建一个新的分支,然后安装扩展包:
$ git checkout -b larastan
$ composer require --dev nunomaduro/larastan
使用
基础使用
扩展包提供了一个命令 code:analyse
,默认情况下分析的是 app 目录,有一个分析等级,从 0 到 7 ,7 是最严格,默认情况先是 5。
因为是一个新的项目,所以没有错误。
测试错误代码
增加一些错误的代码试一下。
$ 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
。
执行一下 code:analyse
,看到有三个错误:
- Requet 类不存在;
- 在一个不存在的对象上,调用 test 方法;
- $test 变量不存在。
修正一下代码再来试一下,把 Requet
修改为 Request
:
app/Http/Controllers/TestController.php
.
.
.
public function index(Request $request)
{
return $request->test($test);
}
}
两个错误:
- Request 类没有 test 方法;
- $test 变量不存在。
将代码修改正确,然后再进行分析。
app/Http/Controllers/TestController.php
.
.
.
public function index(Request $request)
{
$test = ['test'];
return $request->only($test);
}
}
测试类型限定及访问性
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 中调用一下这个类。
出现错误了:
- test 方法需要返回数组;
- 不能调用外部不可访问的属性;
- test 方法需要传入字符串,但是我们传入了数字。
错误格式化
扩展包还支持我们格式化最后的错误信息,可以尝试一下:
php artisan code:analyse --error-format prettyJson
最后我们修正一下错误:
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'