debian10 php7.3 大量日志错误 “Warning: Use of undefined constant xxx”

这个提示的意思是 警告:使用了未定义的常量 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);
}