静态扫描为你的PHP项目上线保驾护航

静态扫描的名称非常多,这里统一称之为静态扫描。静态扫描是指在不运行代码的方式下,通过词法分析、语法分析、抽象语法树分析等技术对程序代码进行扫描,验证代码是否满⾜规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。如何借助静态扫描来为我们的PHP项目上线保驾护航,从Why、How和What三个角度为大家分享了静态扫描的落地实践和最终成果。
展开查看详情

1.静态扫描为 PHP 项⽬目保驾护航 周梦康 2019.04.20

2.⾃自我介绍 多个开源项⽬目 tipi、yar-java、doc-php 的作者与参与者 阿⾥里里云⾼高级开发⼯工程师 博客 https://mengkang.net

3.⽬目录 Why 为什什么要代码静态扫描 How 怎么去做代码静态扫描 What 发布与集成测试的成果

4.什什么是静态扫描 # static-analysis # static-code-analysis # static-program-analysis 程序静态分析是指在不不运⾏行行代码的⽅方式下,通过词法分析、语法分 析、抽象语法树分析等技术对程序代码进⾏行行扫描,验证代码是否满⾜足规 范性、安全性、可靠性、可维护性等指标的⼀一种代码分析技术。 # 静态分析 # 静态扫描 # 静态代码扫描 # 静态代码分析 # 程序静态分析 https://en.wikipedia.org/wiki/Static_program_analysis https://baike.baidu.com/item/程序静态分析/1968823

5.PHP 项⽬目为什什么需要做静态扫描 1 弱类型与⽆无类型声明 PHP 7 引⼊入类型声明 2 解释性语⾔言实时编译 3 丰富的包、递归依赖

6.弱类型(泛型返回值)错把数组当对象 Call to a member function getUserId() on a non-object

7.返回值⽆无类型声明 错把对象当数组 Cannot use object of type Entity\Article as array

8.类继承成员变量量访问级别覆盖

9.版本兼容性问题 背景:接⼿手⾮非常⽼老老的项⽬目进⾏行行维护 不不⼩小⼼心使⽤用了了不不存在的语法糖 [] ?? ?: 顺⼿手写了了不不存在的函数 array_column 写了了不不⽀支持的语法 empty(xx_function($x))

10.PHP 的运⾏行行时编译优势与隐患 php Zend 编译器器 opcode 物理理机 code 虚拟机

11.PHP 的运⾏行行时编译优势与隐患 类型约束差⻛风险⾼高 代码 写的快 模糊kv多影响语义 ⻛风⼀一样 的 ⾯面向对象思想缺失 美男⼦子 编译快 部署快 上下⽂文解析隐患

12.PHP 7 新特性 参数类型、返回值类型声明

13.PHP 7.4 类成员变量量类型声明 https://wiki.php.net/rfc/typed_properties_v2

14.PHP 解析⼩小互动 为什什么 a.php 看不不到错误 b.php 却可以

15.PHP 包管理理⼯工具的发展 Composer Pear 的⾰革命者,使⽤用⽅方便便 ⽽而且兼容 Pear,依赖关系更更清晰 Pear2 Pear 的升级版 使⽤用 Pyrus 新⼀一代的包管理理器器 Pecl C/C++ 扩展包仓库 编译安装后随PHP载⼊入内存 Pear PHP 4.04 开始随核⼼心包⼀一起分发 初衷是模仿Perl社区共享代码的套路路 1999 2004 2009 2012

16.PHP 项⽬目发展背后的潜在⻛风险 composer create-project --prefer-dist laravel/laravel blog ⽂文件数 5927 代码⾏行行数 47万 语法检测、类型推断等 ⼈人⼯工检查 ⼼心有余⽽而⼒力力不不⾜足

17.⽬目录 Why 为什什么要代码静态扫描 How 怎么去做代码静态扫描 What 发布与集成测试的成果

18.⼯工具选择 - PHPStan https://github.com/phpstan/phpstan

19.⼯工具选择 - PHPSA https://github.com/ovr/phpsa

20.⼯工具选择 - Phan https://github.com/phan/phan

21.依托 PHP-Parser ⾃自⼰己造轮⼦子 https://github.com/nikic/PHP-Parser

22.依托 PHP-Parser ⾃自⼰己造轮⼦子

23.使⽤用 Phan 安装 php-ast 扩展 https://github.com/nikic/php-ast composer require phan/phan

24.⽬目录 Why 为什什么要代码静态扫描 How 怎么去做代码静态扫描 What 发布与集成测试的成果

25.使⽤用 Phan 简单扫描

26.使⽤用 Phan 简单扫描

27.使⽤用 Phan 扫描项⽬目 ./vendor/bin/phan --init --init-level=3 ./vendor/bin/phan --progress-bar

28.使⽤用 Phan 扫描项⽬目

29.项⽬目发布实践 - AoneFlow 分⽀支管理理