PHP字符串比较必须用===避免类型转换误判,如"0"==0为true而"0"===0为false;判空应组合isset()和trim()==="";strpos()需用!==false防0被误判;取数组值前须用??或filter_input()兜底。

if判断字符串时,== 和 === 的区别必须分清
PHP弱类型会让 == 在比较时自动类型转换,造成意料之外的匹配。比如 $str == 0,当 $str 是 "0"、""、"false" 甚至 "on"(转成 int 是 0)时都可能为真。
真正想判断“字符串是否严格等于某个值”,必须用 ===:
-
"0" == 0→ true(松散比较触发类型转换) -
"0" === 0→ false(类型不同,直接失败) -
"hello" == true→ true(非空字符串转为 bool 就是 true) -
"hello" === true→ false(字符串不等于布尔值)
尤其在表单校验、状态字段比对(如 $_POST['status'] == 'active')时,不用 === 很容易放行非法值。
判断字符串是否为空,别只靠 empty()
empty($str) 对 ""、0、"0"、null、false 都返回 true,但你往往只关心它是不是“空字符串”,而不是“所有假值”。
立即学习“PHP免费学习笔记(深入)”;
典型误用场景:
-
$_POST['age'] = "0"→empty($_POST['age'])是 true,但年龄为 0 是合法输入 -
$str = "0"→ 你本意是检查用户有没有填,结果被当成空
更安全的做法是组合判断:
- 确认变量存在且是字符串:
isset($str) && is_string($str) - 再检查内容是否为空:
trim($str) === ""或strlen(trim($str)) === 0
用 strpos() 判断包含关系,必须用 !== false
strpos() 找到子串时返回起始位置(可能是 0),没找到才返回 false。如果写成 if (strpos($a, $b)),当子串在开头时(返回 0),整个条件就变成 if (0) → false,逻辑反转。
正确写法只有两种:
-
strpos($haystack, $needle) !== false(推荐,语义明确) -
strpos($haystack, $needle) === false(用于“不包含”分支)
不区分大小写请换用 stripos(),规则一样,也必须用 !== false。
从数组或超全局变量取字符串前,先确认键存在
直接写 if ($_GET['id'] == "123"),如果 id 参数没传,PHP 会触发 Notice: Undefined index,而且松散比较下 NULL == "123" 是 false —— 表面看没报错,但逻辑已不可靠。
稳妥做法是提前兜底:
- 用空合并操作符:
$id = $_GET['id'] ?? '' - 再做类型和内容判断:
is_string($id) && $id === "123" - 或者更彻底:用
filter_input()做过滤和默认值设定
这个细节在 API 入口、路由分发、权限校验里最容易被忽略,一旦参数缺失,后续逻辑可能静默走错分支。



















