PHP代码静态分析与质量保障代码质量是项目长期维护的基础。PHP有多个静态分析工具可以在不运行代码的情况下发现潜在问题。今天说说PHPStan、Psalm和PHP_CodeSniffer的使用。PHPStan是最流行的PHP静态分析工具。它可以发现类型错误、未定义变量、参数不匹配等问题。php// PHPStan能发现的问题示例class OrderService{private array $orders [];public function addOrder(array $order): void{$this-orders[] $order;}// PHPStan会发现返回值类型不匹配public function getOrder(int $id): ?array{return $this-orders[$id] ?? null;}// PHPStan会发现可能为nullpublic function processOrder(int $id): void{$order $this-getOrder($id);// PHPStan会报告$order可能是nullecho $order[status]; // 潜在错误}// PHPStan会发现未定义的方法public function calculateTotal(array $items): float{$total 0;foreach ($items as $item) {$total $item-getPrice(); // 如果getPrice不存在PHPStan会报告}return $total;}}// PHPStan配置phpstan.neon// parameters:// level: 8// paths:// - src// excludePaths:// - src/Legacy// checkMissingIterableValueType: true// checkGenericClassInNonGenericObjectType: true?Psalm是另一个静态分析工具功能类似但侧重点不同php// Psalm能处理的注解class UserService{/** var array */private array $users [];/*** param array{name: string, email: string} $data* return array{id: int, name: string, email: string}*/public function createUser(array $data): array{$id count($this-users) 1;$user [id $id,name $data[name],email $data[email],];$this-users[] $user;return $user;}/*** return array*/public function getAllUsers(): array{return $this-users;}/*** template T* param T $item* return T*/public function identity(mixed $item): mixed{return $item;}}?PHP_CodeSniffer检查编码规范php// PSR-12编码规范检查// 不符合规范的代码class user_controller { // 类名应该PascalCasepublic function CreateUser() { // 方法名应该camelCase$Name test; // 变量名应该camelCasereturn $Name;}}// 符合规范的代码class UserController{public function createUser(): string{$name test;return $name;}}?自动化代码质量检查可以集成到CI流程中phpclass CodeQualityChecker{private string $projectDir;private array $results [];public function __construct(string $projectDir){$this-projectDir $projectDir;}public function runAllChecks(): array{$this-checkSyntax();$this-checkStyle();$this-checkStaticAnalysis();$this-checkDuplicateCode();return $this-results;}private function checkSyntax(): void{echo 检查语法...\n;$files new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this-projectDir . /src));$errors 0;foreach ($files as $file) {if ($file-getExtension() ! php) continue;$result exec(php -l {$file-getPathname()} 21);if (str_contains($result, Parse error)) {echo 语法错误: {$file-getFilename()}\n;$errors;}}$this-results[syntax] $errors 0;}private function checkStyle(): void{echo 检查编码规范...\n;// 简化的编码规范检查$this-results[style] true;}private function checkStaticAnalysis(): void{echo 检查静态分析...\n;$this-results[static_analysis] true;}private function checkDuplicateCode(): void{echo 检查重复代码...\n;$this-results[duplicate_code] true;}}$checker new CodeQualityChecker(__DIR__);$results $checker-runAllChecks();print_r($results);?持续集成配置文件yaml# .github/workflows/ci.ymlname: CIon: [push, pull_request]jobs:quality:runs-on: ubuntu-lateststeps:- uses: actions/checkoutv2- uses: shivammathur/setup-phpv2with:php-version: 8.2tools: composer, phpstan, phpcs- run: composer install- run: phpstan analyse src --level8- run: phpcs src --standardPSR12- run: vendor/bin/phpunitPHP的静态分析工具可以帮助你在代码运行前就发现潜在问题。特别是PHPStan的level 8或最高级别能发现很多细微的错误。这些工具和测试一起构成了代码质量的保障体系用好了能省很多调试时间。
PHP代码静态分析与质量保障
PHP代码静态分析与质量保障代码质量是项目长期维护的基础。PHP有多个静态分析工具可以在不运行代码的情况下发现潜在问题。今天说说PHPStan、Psalm和PHP_CodeSniffer的使用。PHPStan是最流行的PHP静态分析工具。它可以发现类型错误、未定义变量、参数不匹配等问题。php// PHPStan能发现的问题示例class OrderService{private array $orders [];public function addOrder(array $order): void{$this-orders[] $order;}// PHPStan会发现返回值类型不匹配public function getOrder(int $id): ?array{return $this-orders[$id] ?? null;}// PHPStan会发现可能为nullpublic function processOrder(int $id): void{$order $this-getOrder($id);// PHPStan会报告$order可能是nullecho $order[status]; // 潜在错误}// PHPStan会发现未定义的方法public function calculateTotal(array $items): float{$total 0;foreach ($items as $item) {$total $item-getPrice(); // 如果getPrice不存在PHPStan会报告}return $total;}}// PHPStan配置phpstan.neon// parameters:// level: 8// paths:// - src// excludePaths:// - src/Legacy// checkMissingIterableValueType: true// checkGenericClassInNonGenericObjectType: true?Psalm是另一个静态分析工具功能类似但侧重点不同php// Psalm能处理的注解class UserService{/** var array */private array $users [];/*** param array{name: string, email: string} $data* return array{id: int, name: string, email: string}*/public function createUser(array $data): array{$id count($this-users) 1;$user [id $id,name $data[name],email $data[email],];$this-users[] $user;return $user;}/*** return array*/public function getAllUsers(): array{return $this-users;}/*** template T* param T $item* return T*/public function identity(mixed $item): mixed{return $item;}}?PHP_CodeSniffer检查编码规范php// PSR-12编码规范检查// 不符合规范的代码class user_controller { // 类名应该PascalCasepublic function CreateUser() { // 方法名应该camelCase$Name test; // 变量名应该camelCasereturn $Name;}}// 符合规范的代码class UserController{public function createUser(): string{$name test;return $name;}}?自动化代码质量检查可以集成到CI流程中phpclass CodeQualityChecker{private string $projectDir;private array $results [];public function __construct(string $projectDir){$this-projectDir $projectDir;}public function runAllChecks(): array{$this-checkSyntax();$this-checkStyle();$this-checkStaticAnalysis();$this-checkDuplicateCode();return $this-results;}private function checkSyntax(): void{echo 检查语法...\n;$files new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this-projectDir . /src));$errors 0;foreach ($files as $file) {if ($file-getExtension() ! php) continue;$result exec(php -l {$file-getPathname()} 21);if (str_contains($result, Parse error)) {echo 语法错误: {$file-getFilename()}\n;$errors;}}$this-results[syntax] $errors 0;}private function checkStyle(): void{echo 检查编码规范...\n;// 简化的编码规范检查$this-results[style] true;}private function checkStaticAnalysis(): void{echo 检查静态分析...\n;$this-results[static_analysis] true;}private function checkDuplicateCode(): void{echo 检查重复代码...\n;$this-results[duplicate_code] true;}}$checker new CodeQualityChecker(__DIR__);$results $checker-runAllChecks();print_r($results);?持续集成配置文件yaml# .github/workflows/ci.ymlname: CIon: [push, pull_request]jobs:quality:runs-on: ubuntu-lateststeps:- uses: actions/checkoutv2- uses: shivammathur/setup-phpv2with:php-version: 8.2tools: composer, phpstan, phpcs- run: composer install- run: phpstan analyse src --level8- run: phpcs src --standardPSR12- run: vendor/bin/phpunitPHP的静态分析工具可以帮助你在代码运行前就发现潜在问题。特别是PHPStan的level 8或最高级别能发现很多细微的错误。这些工具和测试一起构成了代码质量的保障体系用好了能省很多调试时间。