PHP5.4升级至7.2出现Illegal string offset 'save_username'警告如何修复
警告成因
你遇到的Illegal string offset 'save_username'警告本质是PHP版本升级后类型校验收紧触发的,具体原因如下:
- 函数
login_form定义时将$vars参数的默认值设为空字符串"",但后续代码始终把$vars当做数组来读取键值。 - PHP 5.4版本中,字符串类型变量使用字符串键访问偏移时只会静默返回null,不会抛出警告;到PHP 7.2版本对类型校验更严格,只有数字下标可以合法访问字符串的偏移,使用字符串键(比如
'save_username')访问字符串变量就会直接抛出该非法偏移警告。 - 就算调用函数时即使传入了
$vars参数,也可能存在$vars数组中没有save_username键的情况,同样会触发相关警告。你之前尝试修改引号、修改值类型都无法解决问题,因为问题根源和键名引号、值的类型无关。
修复方案
两步修改即可解决:
- 首先将函数
$vars参数的默认值改为空数组,避免默认情况下$vars为字符串类型:
// 修改前 // function login_form($vars = "") { // 修改后 function login_form($vars = []) {
- 给所有访问
$vars数组键的位置增加存在性判断,避免访问不存在的键:
function login_form($vars = []) { // 提前初始化变量避免未定义警告 $username = ''; $save_username = false; if (empty($vars)) { // 检查cookie是否存在且不为空 if (!empty($_COOKIE["username"])) { $username = $_COOKIE["username"]; $save_username = true; } } else { // 用null合并运算符处理username不存在时默认返回空字符串 $username = $vars['username'] ?? ''; } // 先判断save_username键存在再做比较 if (isset($vars['save_username']) && $vars['save_username'] == 1) { $save_username = true; } // 原有HTML表单部分保持不变即可
内容的提问来源于stack exchange,提问作者Matias
相关产品推荐
相关产品推荐

