PHP字符串处理需用mb_*函数应对UTF-8多字节字符,引号嵌套须内外单双引号分离,布尔比较必须用===避免类型转换,数组取值前应用??或isset兜底。

PHP字符串处理报错,八成不是语法写错了,而是对“字符串”本身的理解有偏差——它在PHP里是字节序列,不是字符集合。中文、emoji、带重音的拉丁字母一掺和,普通函数就容易崩。
长度与截取乱码:别再用 strlen 和 substr 处理中文
这是新手最常撞墙的地方。UTF-8下,“你好”占6个字节,但只有2个字符。用 strlen() 得到6,用 substr($str, 0, 2) 可能只拿到“你”的前两个字节,结果是乱码。
- 一律改用 mb_strlen($str, 'UTF-8') 获取真实字符数
- 截取必须用 mb_substr($str, $start, $length, 'UTF-8'),编码参数不能省
- 上线前检查 php.ini 是否启用了 extension=mbstring,否则 mb_* 函数会直接报 fatal error
引号嵌套出错:双引号里混 HTML 属性是高危操作
像 echo "编辑"; 这种写法,PHP 在第一个 " 后就认为字符串结束了,“https://www.php.cn/link/1297bcaf6f829c2afe9cae03f1975683”变成裸代码,立刻抛 Parse error: syntax error, unexpected identifier。
- 外层用双引号时,HTML 属性统一改用单引号:href='https://www.php.cn/link/51b458b4e6ac5bfdcce31855ad2c0fec'
- 或反过来,外层用单引号,内部变量用 {$id} 插值(单引号不解析变量,所以得配合大括号+点号拼接)
- 更稳妥的做法是拆开写:echo '编辑';,顺便防XSS
比较逻辑翻车:'1' == true 居然为真?
松散比较(==)会触发类型转换。'1' 转成数字是 1,true 转成数字也是 1,于是 '1' == true 返回 true——这在权限判断、状态校验里极易埋雷。
立即学习“PHP免费学习笔记(深入)”;
- 所有布尔判断、ID匹配、开关字段,一律用 ===(全等)
- 字符串内容比对优先用 strcmp($a, $b) === 0,它不转类型,且区分大小写
- 如果要忽略大小写,用 strcasecmp($a, $b) === 0,别用 stristr 做比较——它是找子串的,不是比相等的
空值与未定义键:$row['name'] 直接取就报警告
数组键不存在时,$row['name'] 不仅输出 Notice,还可能让整个页面白屏(尤其开启 display_errors 时)。这不是语法错误,但属于运行时高频报错。
- 取值前加判断:isset($row['name']) ? $row['name'] : ''
- PHP 7+ 推荐用空合并操作符:$row['name'] ?? '未知'
- 批量处理时,先用 array_key_exists('name', $row) 或 !empty($row['name']) 做兜底



















