这个提示的意思是 警告:使用了未定义的常量 xxxx, 将在下一个php版本, 把此警告升级为错误。
这挺吓人的,
以前, 大家在写php数组时, 字符串下标经常不加引号, 比如 $a[abc]; 规范的写法是 $a['abc'];
abc 不加引号, 就会有歧义, 这到底是个字符串, 还是一个定义了的常量。
大家需要在debian11(php7.4)之前, 把这个问题解决, 把以前的代码都过一遍。这很麻烦。
我写了一个php程序, 用来自动修正这个问题, 这个程序会跳过字符串内部的数组下标对字符串外的变量进行修改。
比如:
- $a[abc]="ip:$_SERVER[REMOTE_ADDR]";
+$a['abc']="ip:$_SERVER[REMOTE_ADDR]";
字符串内部的REMOTE_ADDR加上单引号时执行会出错, 这个php程序就是利用这个执行错误, 在对每一个找到的下标, 逐次加上单引号进行运行测试,出错的就放弃当次修改。执行方式如下,对test.php进行修正:
./array_fix.php test.php
修正之后, 用git add -p 逐一检查每一个修改, 把修改放进commit的cache, 然后 git checkout -p逐一恢复放弃的修改。
这个程序, 能减少90%的工作量, 还有10%是需要人工判断的。
程序源码文件:array_fix.php
#!/usr/bin/php
<?php
$f=$_SERVER['argv'][1];
if (!file_exists($f)) {
die("文件没有找到 $f\r\n");
}
$a=file_get_contents($f);
$t=0;
for ($i=0; $i<strlen($a); $i++) {
$c=$a[$i];
switch ($t) {
case 0: //先找'['
$o.=$c;
if ($c=='[') {
$t=1;
$begin=$i+1;
}
break;
case 1: //找']'
if ($c==']') {
$d=substr($a, $begin, $i-$begin);
if ($d=='' or is_numeric($d)) { //数组的key是数字,跳过不处理
$o.=$d.$c;
} else {
file_put_contents("$f.tmp", $o."'$d'".substr($a, $i));
$err=0;
system("php -l $f.tmp >/dev/null 2>/dev/null", $err);
unlink("$f.tmp");
if ($err==0) { //php测试不出错, 增加单引号
$o.="'$d'$c";
$change=1;
} else { //php测试出错, 当前的数组,可能在字符串中, 则不做处理
$o.="$d$c";
}
}
$t=0;
break;
} elseif ($c=='_' or ($c>='a' and $c <='z') or ($c>='A' and $c<='Z') or ($c>='0' and $c<='9')) {
break;
} else {
$o.=substr($a, $begin, $i-$begin).$c; //非有效变量名, 跳过当次处理, 继续寻找'['
$t=0;
break;
}
}
}
if ($change == 1) {
file_put_contents($f, $o);
}