""是string类型,可安全调用strlen()等函数;null是独立null类型,直接调用strlen()会触发警告;empty()判断“假值”,isset()检测是否已定义且非null,is_null()唯一可靠判null方式。

PHP里 "" 和 null 是两种完全不同的类型
空字符串 "" 是 string 类型,已初始化、占内存、能安全调用 strlen() trim() 等函数;null 是独立的 NULL 类型,表示“无值”,不是字符串、不是数组、甚至不是 false 或 0。直接对 null 调用 strlen() 会触发 E_WARNING。
empty()、isset()、is_null() 到底在判什么
这三个函数行为差异极大,混用极易出错:
-
empty($var):返回true的情况包括null、""、0、0.0、false、[]——它不是在判断“是不是空字符串”,而是在做一次宽松的“假值转换” -
isset($var):只关心变量是否已定义且不为null;$var = ""时isset()返回true,$var = null或未定义时返回false -
is_null($var):唯一可靠、语义明确的null检测方式;它不接受未定义变量(会报Notice),所以常配合isset()使用:!isset($var) || is_null($var)
松散比较 == 和严格比较 === 的陷阱
PHP 的类型隐式转换会让 == 失去区分能力:
-
"" == null返回true—— 这是松散比较自动转成布尔false == false的结果,但业务上二者含义完全不同 -
"" === null返回false—— 类型不同,严格比较立刻失败,这才是你该依赖的行为 - 接口入参或数据库字段映射中,
""往往代表“用户提交了空白”,null代表“字段未传/未填写/数据库允许为空但没值”,混用会导致逻辑漏判
实际写法推荐:按场景选检测组合
没有万能的“一行判断”,得看你要解决什么问题:
- 想确认变量是“显式的空字符串”?用
is_string($var) && $var === "" - 想确认变量是“真的没值(含未定义)”?用
!isset($var) || $var === null - 想确认变量“有值且非空”(比如要拼接或入库)?用
isset($var) && is_string($var) && $var !== "" - 别用
empty($var)做类型判断——它连0都当空,不适合字段校验
最麻烦的从来不是语法记不住,而是同一份数据里同时存在 "" 和 null:API 响应不一致、数据库写入语义模糊、前端二次序列化后丢失类型——这些都得从接口设计和 ORM 映射层就卡死。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











