迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

在 PHP 中执行静态代码分析

作者:迹忆客 最近更新:2023/03/27 浏览次数:

开发的重要部分是识别错误并从您的代码库中快速消除它们,我们可以在 PHP 中编写代码或执行静态代码分析来实现这一点。 本篇文章介绍了 lint 模式和一些其他方法如何在 PHP 中执行静态代码分析。

静态代码分析是检测错误、提高一般开发人员生产力、自动完成以及使用强类型 PHP 代码的许多类型相关功能重构代码的一种令人难以置信的方法。 在执行或编译之前,您可以检查源代码以消除语法错误并执行 PHP 编码标准和样式以检测代码中的安全漏洞。

lint 模式是在 PHP 中执行静态代码分析的最佳方法之一,我们将进一步了解 php lintPHPMDpfffHHVM,以采用更适合自己需求的方法。 它严重依赖 PHP 的类型系统,您为静态分析提供的信息越多,您获得的结果就越好,在代码中声明类型是添加更多信息的一种方式。

获取精选帖子列表的函数 function exp_funct ($args) {} 可以声明为 function exp_funct (array $args) : array {} 以提供静态代码分析的更多信息。 或者,您可以添加 PHPDoc 注释以在声明函数之前使用类似 // @return array<exp_var> 的内容来声明或初始化函数输入和输出类型。


使用lint模式在PHP中进行静态代码分析

Lint PHP 模式是执行静态代码分析以检查语法错误并识别未使用的变量分配、未进行任何初始化的分配数组、可能的代码风格警告等的最佳方法之一。 您可以通过运行 PHP 来使用 php -l FILENAME 并验证语法,而无需从 shell 或任何其他命令行以 lint 模式执行。

互联网上有许多基于 PHP Lint 的高级和低级静态分析器。 例如,php-satPHPStanPHP-CS-Fixerphan 是一些较高级别的静态分析器; 另一方面,PHP Parser和token get all(原始函数)是一些基于PHP Lint的底层分析器。

您可以将给定的源代码拆分为 PHP 令牌,例如 token_get_all(string $code, int $flags = 0): array,token_get_all 将帮助您使用 Zend 引擎的词法扫描器将给定的代码字符串解析为 PHP 语言令牌。 TOKEN_PARSE 参数标志识别在特定上下文中使用保留字的能力,并帮助返回令牌标识符数组。

此方法返回的每个标记标识符要么是单个字符,要么是一个三元素数组,其中分别包含标记索引、原始标记的字符串内容以及元素 0、1 和 2 中的行号。 你会发现 token_get_all() 的两个例子; 一种是一般用途,另一种是使用保留字在类上执行。

<?php
    $userQuota_getToken = token_get_all('<?php echo; ?>');

    foreach ($userQuota_getToken as $get_tokenQ) {
        if (is_array($get_tokenQ)) {
            echo "Line {$get_tokenQ[2]}: ", token_name($get_tokenQ[0]), " ('{$get_tokenQ[1]}')", PHP_EOL;
        }
    }
?>

// 2nd example on class

/*

$token_quota_source = <<<'code'

class A
{
    const PUBLIC = 1;
}
code;

$userQuota_getToken = token_get_all($token_quota_source, TOKEN_PARSE);

foreach ($userQuota_getToken as $get_tokenQ) {
    if (is_array($get_tokenQ)) {
        echo token_name($get_tokenQ[0]) , PHP_EOL;
    }
}

*/

// its output will be something similar
/*

T_OPEN_TAG
T_WHITESPACE
.
.
.
T_CLASS
T_WHITESPACE
T_STRING
.
.

*/

输出结果:

Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')

此外,运行时分析器在 lint 模式下工作,由于这种编程语言的动态特性,它在某些方面更有用。 Xdebug 是具有代码覆盖率和功能跟踪器的运行时分析器。

phpweaver 具有 Xdebug 函数跟踪并使用组合的静态/动态方法来执行代码分析。 如果您正在寻找用于生产服务器的静态代码分析器,xhprof 是最好的 lint 模式静态分析器,类似于 Xdebug,但更轻巧并且包含基于 PHP 的界面。


使用 PHPMD 或 PHP Depend Project 在 PHP 中执行静态代码分析

它代表 PHP Mess Detector,是 PHP Depend 的一个衍生项目,旨在成为著名的 Java PMD 工具的等效静态代码分析器。 你可以使用 composer 安装 PHP_Depend,curl -s http://getcomposer.org/installer | php 和 php composer.phar 需要 pdepend/pdepend:2.12.0 或者如果你有任何全局安装的作曲家。

另一方面,PHPMD 比 PHP_Depend 更可取,因为它对用户更友好,并且具有易于配置的前端,用于由 PHP_Depend 测量的原始指标。 它采用给定的源代码(PHP 代码)基础,并且由于它具有简单的工作原理,因此会查找或尝试在该源代码中查找潜在的错误或注意事项。

它可以轻松检测错误和语法错误、过于复杂的表达式、未使用的属性、方法、参数和次优代码。 作为一个成熟的 PHP 项目和静态代码分析器,PHP Mass Detector 提供了一个庞大的预定义规则库来分析 PHP 源代码。

// Type phpmd [filename|directory] [report format] [ruleset file]

hassan@jiyik ~ $ phpmd PHP/Depend/DbusUI/ xml rulesets/codesize.xml
<?xml version="1.0" encoding="UTF-8" ?>
<pmd version="0.0.1" timestamp="2009-12-19T22:17:18+01:00">
  <file name="/projects/pdepend/PHP/Depend/DbusUI/PHPMD.php">
    <violation beginline="54"
               endline="359"
               rule="TooManyProperties"
               ruleset="Code Size Rules"
               package="PHP_Depend\DbusUI"
               class="PHP_Depend_DbusUI_ResultPrinter"
               priority="1">
      This class has too many properties; consider refactoring it.
    </violation>
  </file>
</pmd>

输出结果如下:

This class has too many properties; consider refactoring it.

可以通过键入 phpmd [文件名|目录] [报告格式] [规则集文件] 来激活或使用 PHP Mess Detector 的命令行用法,并且可以将文件/目录名称传递给 PHPMD 作为 PHP 源的容器 用于分析的代码。 codesize.xml 或规则集参数看起来像一个文件系统参考,因为它的 Phar 分布在其存档中包含规则集文件。

此外,它使 PHP 程序员能够使用缩短的名称或引用来引用内置规则集,如 phpmd Depend XML codesize。 PHPMD 的命令行界面还接受可选参数,如 --min-priority--report-file--suffixes--strict 等等。

您可以应用 ~ $ phpmd /path/to/source text codesize 配置,方法是使用针对测试中的源代码应用的多个规则集,并使用设置的名称启用对其 CLI 工具的调用。 此外,它允许程序员进行深入配置,将自定义规则集文件与内置规则集混合使用,~ $ phpmd /path/to/source text codesize,/my/rules.xml 命令就是一个很好的例子 指定您的自定义规则集以分析源代码。


使用 pfff 工具在 PHP 中执行静态代码分析

作为一组 API 和工具,它可以执行静态代码分析以索引、搜索、导航、可视化、重构源代码以及保持样式的源到源 PHP 代码转换。

编译安装pfff很容易; 但是,它会生成复杂格式的结果,例如 go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl 或 login-now.php:7:4: CHECK: Unused Local variable $title。 您可以使用 $ ~/sw/pfff/scheck ~/code/github/sc/ 访问 GitHub 上的 pfff。

此外,您可以通过复制项目目录中的 commons/parsing_php/ 目录并添加递归 make,将解析库嵌入到您自己的 OCaml 应用程序中; 最后,将应用程序与 parsing_php/parsing_php.cma & commons/commons.cma 库链接。 此外,请观察 pfff/demos/Makefile 以更好地理解,编译源代码后,您可以使用以下内容测试 pfff:

$ cd demos/
$ ocamlc -I ../commons/ -I ../parsing_php/ \
../commons/commons.cma ../parsing_php/parsing_php.cma \
show_function_calls1.ml -o show_function_calls
$ ./show_function_calls foo.php

之后,您必须能够根据 Facebook 档案中 pfff 项目中 show_function_calls1.m1 中的代码,在 stdout 上看到有关 foo.php 中函数调用的一些有用信息。 pfff 解析器非常高效,您可以在 phpbb 网站上对其进行测试。

// source code of pfff command-line
$ cd /tmp
$ wget http://d10xg45o6p6dbl.cloudfront.net/projects/p/phpbb/phpBB-3.0.6.tar.bz2
$ tar xvfj phpBB-3.0.6.tar.bz2
$ cd <pfff_src_directory>
$ ./pfff -parse_php /tmp/phpBB3/

然后 pfff 程序应该遍历所有源代码文件(.php 源文件)并在每个源文件上运行解析器并输出一些统计信息,例如:NB total files = 265; perfect = 265; =========> 100% and nb good = 183197, nb bad = 0 =========> 100.000000% 这意味着 pfff 能够解析 100% 的 PHP 源代码。

作为命令行程序,它具有不同的命令,如 pfff 来测试 PHP 语言解析器。 您可以使用 scheck 来查找错误,它的工作方式类似于 Emacs 标记生成器的 lint 和 stag,比其他任何工具都更加精确。

sgrep 是一个合成的 grep,可以很容易地找到精确的代码模式,spatch 是一个语法补丁,可以很容易地重构 PHP 代码,还有 codemap、pfff_db、codegraph 和 codequery,这些都是最新添加到 pfff 工具对一组源文件执行全局分析或查询有关 PHP 代码库结构的信息。


使用 HHVM 在 PHP 中执行静态代码分析

它具有内置的 Proxygen 和 FastCGI 服务器类型支持,可以成为完美的静态代码分析器之一。 HHVM 被称为功能齐全的 Web 服务器,直接内置了 Proxygen,其易用性和处理源代码的特性使其非常适合静态代码分析。

它服务于快速 Web 请求,并提供相当于 FastCGI 和 Nginx 组合的高性能 Web 服务器。 您可以执行 hhvm -m server -p 8080 以在服务器模式下运行 HHVM 时使用 Proxygen,并且可以通过命令行配置设置端口:hhvm.server.port=7777,或将 -d hhvm.server.port=7777 放入您的 服务器 .ini 文件。

您可以使用 -d hhvm.server.type=proxygen 命令来定义 Proxygen 服务器类型,而无需明确指定它(Proxygen 是默认值)。 初始化脚本 HHVM 包默认以 FastCGI 模式启动,需要调整配置才能作为服务器自动启动。

以下是在命令行中使用不同的可自定义选项(server.ini 或 -d 选项)配置 HHVM 包的示例。 请记住,其中一些配置选项是可选的,因为它们是默认值,但它们可以帮助向用户提供更多信息或显示插图。

// initialize a server port
hhvm.server.port = 60
// the default server type is `proxygen`
hhvm.server.type - proxygen
hhvm.server.default_document = source.php
hhvm.error_document404 = source.php
hhvm.server.source_root = /edit/source/php

使用可选的配置选项有利于明确文档目的,而 hhvm.server.source_roothhvm.server.port 最有可能需要明确的值。 HH 虚拟机是开源的,用 Hack 编写,并使用 JIT(即时)编译来实现卓越的性能,同时保持出色的开发灵活性。

HHVM 二进制文件启动的默认目录是 default_document,您可以根据您的服务器更改该目录。 在您的 PHP 项目中将 HHVM 安装到操作系统后,您可以使用 sudo update-rc.d hhvm defaultssudo service hhvm restart 命令将 HHVM 设置为在启动时作为服务器启动。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 PHP 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:183 分类:PHP

本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

PHP 中的重定向

发布时间:2023/03/29 浏览次数:136 分类:PHP

本教程演示了如何将用户从页面重定向到 PHP 中的其他页面

PHP 分页

发布时间:2023/03/29 浏览次数:66 分类:PHP

本教程介绍如何在 PHP 中对数据库行进行分页

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便