PHP 7.3+ 要求类属性必须显式声明访问修饰符,未声明者需批量补 public;应结合 token_get_all() 精准定位类内 $var 属性行,避开注释、字符串、函数体等干扰,正则替换须用 m 模式及负向断言,并严格执行备份与差异审查。

PHP 7.3 本身不支持为类属性声明默认访问控制(如 public $name; 不写修饰符会报错),但很多老项目在升级到 PHP 7.3+ 后,因未显式声明 public、protected 或 private,导致解析失败或触发严格警告。批量补全缺失的默认访问修饰符(通常补 public)是常见重构动作,关键在于**精准识别无修饰符的属性声明行,且不误改注释、字符串、函数参数或 trait/use 语句**。
定位真实属性声明行
不能只靠正则匹配 $varName,必须结合语法上下文。有效特征包括:
- 行首或缩进后紧接
var、public、protected、private、static等关键字,或直接以$开头且前一行不是function、class、if等关键词 - 该行需包含
=或分号;,且不含括号(、)和花括号{、} - 排除位于双引号/单引号内、PHPDoc 注释块(
/** ... */)、use或trait声明中的伪属性
用 preg_replace 安全补 public 修饰符
推荐使用带行锚点和负向先行断言的正则,避免跨行误匹配:
- 模式:
/^(\s*)(?!(?:public|protected|private|var|static)\b)(\$\w+\s*(?:=\s*(?:[^;]+)?);)/m - 替换:
$1public $2 - 务必加
m修饰符启用多行模式,^和$才能匹配每行开头结尾 - 先用
preg_match_all干跑验证匹配结果,确认只捕获目标行再执行写入
优先处理 class 主体,跳过干扰区域
遍历文件时,应主动跳过非目标区域:
立即学习“PHP免费学习笔记(深入)”;
- 用
token_get_all()解析 PHP 代码结构,只在T_CLASS→T_CURLY_OPEN→T_VARIABLE的上下文中检查属性 - 过滤掉
vendor/、node_modules/、tests/、.git/、缓存目录等非业务代码路径 - 对
.php文件做mb_detect_encoding()检查,确保 UTF-8 编码下正则能正确识别中文变量名
备份 + 差异审查不可省略
任何批量修改都必须留退路:
- 执行前用
copy($file, $file . '.pre73.bak')备份原始文件 - 替换后立即运行
git diff --no-index $file $file.pre73.bak查看改动范围 - 重点检查是否误改了
foreach ($arr as $item)中的$item,或函数内$tmp = ...类临时变量 - 搭配静态分析工具如
phpstan或psalm扫描,确认无新增类型错误



















