php codesniffer,为你的 PHP_CodeSniffer 构建自定义规则

为你的 PHP_CodeSniffer 构建自定义规则

什么是PHP_CodeSniffer?

PHP_CodeSniffer 是 PEAR 中的一个用检测PHP代码是否符合编码规范的扩展包. 它可以促进你写出符合编码规范的代码, 也可以实现代码审查中对编码规范审查自动检测工作. 总的来说, 就是个犀利的工具.

sniffs(嗅探规则)

PHP_CodeSniffer 里的编码检测规则称之为 sniffs (嗅探规则).

HOW TO

1. 创建编码规范的目录

进入 PHP_CodeSniffer 安装目录下的 Standards 目录, 创建编码规范目录以及用于存放规范对应的嗅探规则的 Sniffs 目录, 以我本地 PHP_CodeSniffer 安装路径为例:

cd /usr/local/php/lib/php/PHP/CodeSniffer/Standards

mkdir -p XWSoulStandard/Sniffs

2. 创建编码规则信息文件

进入编码规则目录, 新建 ruleset.xml 文件, 该文件用于存储编码规则的信息以供 PHP_CodeSniffer 读取, 同时作为表示当前目录是编码标准目录的标识.

cd XWSoulStandard

touch ruleset.xml

输入编码规范的相关信息, 大致如下

xwsoul's coding standard.

这里我们就采用 ruleset.xml 的最小配置, 更多信息请参照 ruleset 附录.

3. 创建嗅探规则文件

一个嗅探规则就是一个PHP文件, 规则文件的命名应当清晰的描述规则的作用, 文件名必须以 Sniff.php 结尾. 在这里我们要创建一个 DisallowHashCommentsSniff.php 的 PHP 文件, 并把他放在 Commenting 子目录下, 用以将这个嗅探规则归类到和评论相关, 具体指令如下:

cd Sniffs

mkdir Commenting

touch Commenting/DisallowHashCommentsSniff.php

嗅探规则的分类子目录不是强制限定的, 只不过这么做在你想要修改/更正规则的时候, 便于你找到它.

4. 编写嗅探规则

每一个嗅探规则都要实现 PHP_CodeSniffer_Sniff 接口, 这样 PHP_CodeSniffer 才会知道规则一旦被调用就该实例化他. PHP_CodeSniffer_Sniff 接口定义的 register() 和 process() 两个方法必须被实现.

5. register() 和 process() 方法

register()方法允许嗅探规则定阅一个或多个它想处理的令牌类型(token types).一旦 PHP_CodeSniffer 遇到了那些令牌中的一个, 它就会调用携带 PHP_CodeSniffer_File 对象的process() 方法, 然后令牌在堆栈中的位置就被找到了.

这里的 sniff 我们重点在处理单行评论. PHP_CodeSniffer 用于在一个文件里提取令牌的的 token_get_all() 方法将文档注释和普通注释识别为两种不同的令牌类型. 因此我们不必担心文档注释会干涉到我们的测试. register() 只需要返回一种令牌类型 T_COMMENT 就可以了.

6. 令牌堆栈

一个嗅探规则可以通过调用 PHP_CodeSniffer_File 对象上的 getTokens() 方法提取令牌堆栈来收集一个令牌的更多的信息. 这个方法返回了一个数组然后会以令牌在令牌堆栈里触发的位置来索引. 所有的令牌数组都有一个代码, 类型以及内容索引. 代码的值是一个令牌类型唯一的整数. 类型的值是一个描述令牌的字符串(如, ‘T_COMMENT’是评论的令牌.)每个类型都有一个对应的使用相同名字的全局定义的整数。最后, 内容的值包含了令牌在代码中展现的内容.

可以看看 PHP/CodeSniffer/File.php 的类注释里标注的完整的令牌的索引列表.

7. 错误报告

一旦错误被检测出来, 嗅探规则会调用 PHP_CodeSniffer_File 上的 addError() 方法, 传入对应的错误消息作为第一参, 错误在堆栈中发生的位置作为第二参, 本嗅探规则中用于做错误唯一标识的代码以及一个用以替代错误消息的数据数组. 当然如果你觉得这里算不上是一个严重的错误, 你可以使用 addWarning() 这个方法.

8. 代码明细:DisallowHashCommentsSniff.php

我们在上面说到的 DisallowHashCommentsSniff 嗅探规则就应该是如下的样子:

/**

* This sniff prohibits the use of Perl style hash comments.

*

* PHP version 5

*

* @category PHP

* @package PHP_CodeSniffer

* @author Your Name

* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence

* @version SVN: $Id: coding-standard-tutorial.xml,v 1.9 2008-10-09 15:16:47 cweiske Exp $

* @link http://pear.php.net/package/PHP_CodeSniffer

*/

/**

* This sniff prohibits the use of Perl style hash comments.

*

* An example of a hash comment is:

*

*

* # This is a hash comment, which is prohibited.

* $hello = 'hello';

*

*

* @category PHP

* @package PHP_CodeSniffer

* @author Your Name

* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence

* @version Release: @package_version@

* @link http://pear.php.net/package/PHP_CodeSniffer

*/

class XWSoulStandard_Sniffs_Commenting_DisallowHashCommentsSniff implements PHP_CodeSniffer_Sniff

{

/**

* Returns the token types that this sniff is interested in.

*

* @return array(int)

*/

public function register()

{

return array(T_COMMENT);

}//end register()

/**

* Processes the tokens that this sniff is interested in.

*

* @param PHP_CodeSniffer_File $phpcsFile The file where the token was found.

* @param int $stackPtr The position in the stack where

* the token was found.

*

* @return void

*/

public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)

{

$tokens = $phpcsFile->getTokens();

if ($tokens[$stackPtr]['content']{0} === '#') {

$error = 'Hash comments are prohibited; found %s';

$data = array(trim($tokens[$stackPtr]['content']));

$phpcsFile->addError($error, $stackPtr, 'Found', $data);

}

}//end process()

}//end class

默认情况下, PHP_CodeSniffer 假定检测的所有代码都是PHP的.你可以指定一个分词器列表来指定你的嗅探规则支持/允许 PHP, JS 或者 XML 文件 或者这三种语言的任意混合. 你可以通过设置你的嗅探规则成员变量 $supportedTokenizers 来做到这点. 将以下代码添加到你的嗅探规则里意味着, 告诉 PHP_CodeSniffer 它可以对 PHP 和 JS 都进行检测:

/**

* A list of tokenizers this sniff supports.

*

* @var array

*/

public $supportedTokenizers = array(

'PHP',

'JS',

);

9. 运行检测

phpcs --standard=XWSoulStandard Test.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 根据引用\[1\]中的内容,BLE设备在广播数据时会在37、38和39三个通道广播数据,但实际上,在尝试连接时使用的通道是唯一的。因此,在使用BLE sniffer进行数据抓取时,需要选择与连接时使用的Advertising channel相对应的通道,以便能够同步并抓取到数据。根据引用\[2\]的建议,如果在解析数据时出现错误,可以尝试将nRF Sniffer for Bluetooth LE的版本从3.1.0更换为4.1.0。此外,根据引用\[3\]的说明,重启Wireshark并重新打开串口也可能解决问题。你可以在nRF Sniffer for Bluetooth LE - Downloads - nordicsemi.com下载nrf_sniffer_for_bluetooth_le_4.1.0的固件。 #### 引用[.reference_title] - *1* [通过蓝牙sniffer抓BLE数据](https://blog.csdn.net/VictoryXu/article/details/51568231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [WireShark ble sniffer -- packet creation error](https://blog.csdn.net/Jason___xiao/article/details/124095007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值