同一PHP版本下token_get_all()返回值不一致问题求助
同一PHP版本下token_get_all返回结果不一致的原因及解决方法
核心原因:short_open_tag配置项差异
这是PHP配置中short_open_tag开关导致的差异:
- 当
short_open_tag设为On时,PHP会识别<? ?>为合法的短标签对,token_get_all会将其拆分为3个元素:T_OPEN_TAG(<?)、空白字符、T_CLOSE_TAG(?>); - 当
short_open_tag设为Off时,PHP不会解析这个短标签,整个<? ?>会被当作普通文本,token_get_all只会返回一个包含完整字符串的元素。
验证配置的方法
在对应环境中执行以下代码,就能看到当前的配置状态:
var_dump(ini_get('short_open_tag'));
返回值为"1"或"On"表示开启,""或"Off"表示关闭。
针对PhpCS问题的解决建议
因为PhpCS的语法检测依赖token_get_all的解析结果,所以不同环境的配置差异会导致检测结果不一致。可以通过两种方式解决:
- 统一所有开发、测试环境的
short_open_tag配置:如果项目中使用短标签就统一设为On,如果遵循PSR规范只用<?php ?>就统一设为Off; - 调整PhpCS规则:避免依赖短标签相关的token解析逻辑,或者在检测前对代码中的短标签做统一处理。
内容的提问来源于stack exchange,提问作者MaryShaw
相关产品推荐
相关产品推荐

