[TOC] #### 1. isset() --- `isset()` 用于判断一个或多个变量是否存在,当所有变量都存在且值不为 null 时返回 true ```php // 即使变量的值为:空字符串、0、false、空数组,也会返回 true $a = ''; $b = 0; $c = []; $d = false; var_dump(isset($a)); // true var_dump(isset($b)); // true var_dump(isset($c)); // true var_dump(isset($d)); // true ``` 如果变量值未定义或者定义了但是值为 null,才代表变量不存在,返回值为 false ```php // 变量未定义,返回 false $listIsset = isset($list); // 返回值 false // 变量已定义,但是变量的值为 null $user = null; $userIsset = isset($user); // 返回值 false ``` `isset()` 的参数必须是一个变量,不能接受常量、字面量或表达式作为参数,传递非变量参数,会导致解析错误 ```php define('PI', 3.1415926); isset(PI); // 常量 isset('hello,world'); // 字面量 ``` `isset()` 还可以接收多个变量,只有当所有变量都存在才返回 true,有一个未定义或值为 null 都返回 false ```php // 所有变量都存在,此时返回 true(传递的所有变量都定义了,并且值均不为 null) $a = ''; $b = 0; $c = []; var_dump(isset($a, $b, $c)); // true // 传递的变量,有未定义的,直接返回 false $a = ''; var_dump(isset($a, $b)); // false // 传递的变量,有值为 null 的,直接返回 false $a = ''; $b = null; var_dump(isset($a, $b)); // false ``` #### 2. empty() --- `empty()` 用于判断一个数据是否为空,数据为空时,返回 true ```php // 以下情况代表数据为空,返回值为 true,其他情况返回 false $v1 = ''; // 空字符串 $v2 = 0; // 数字 0 $v3 = 0.0; // 浮点 0.0 $v4 = '0'; // 字符串 0 $v5 = null; // 值为 null $v6 = false; // 值为 false $v7 = []; // 空数组 var_dump(empty($v1)); // true var_dump(empty($v2)); // true var_dump(empty($v3)); // true var_dump(empty($v4)); // true var_dump(empty($v5)); // true var_dump(empty($v6)); // true var_dump(empty($v7)); // true // 变量未定义,也属于数据为空 var_dump(empty($user)); // true // 补充:虽然字符串 '0' 代表数据为空,但是字符串 '0.0' 不属于数据为空 var_dump(empty('0.0')); // false ``` 在 `PHP 5.5` 之前,`empty()` 只能接收变量作为参数,将其他非变量内容作为参数,会导致解析错误 ```php $name = 'liang'; empty($name); // 正常写法 empty(trim($name)); // 会导致报错 ``` 从 `PHP 5.5` 开始,`empty()` 不仅支持变量,还支持常量、字面量、表达式、函数调用 ```php $name = ' '; define('PI', 3.14); var_dump(empty(PI)); // false var_dump(empty('')); // true var_dump(empty(1 == 2)); // true var_dump(empty(trim($name))); // true ``` 需要注意的是,`empty()` 不支持接收多个参数,只能接收一个数据作为参数,它的函数原型为: ```php bool empty ( mixed $var ) ``` 如果需要检查多个数据是否为空,可以调用多次 `empty()`,结合逻辑运算符实现 ```php if (empty($var1) && empty($var2) && empty($var3)) { // ... } ``` #### 3. is_null() --- `is_null()` 用于判断一个变量的值是否为 null,只有当变量的值为 null 时才返回 true ```php // 变量的值为 null $var = null; var_dump(is_null($var)); // true // 非 null 值都返回 false $var2 = ''; $var3 = 0; $var4 = false; var_dump(is_null($var2)); // false var_dump(is_null($var3)); // false var_dump(is_null($var4)); // false ``` 从 `PHP 5.5` 开始,`is_null()` 的参数不仅支持传入一个变量,也支持传入常量、字面量、表达式 ```php define('PI', 3.14); var_dump(is_null(PI)); var_dump(is_null('hello')); var_dump(is_null(1 == 2)); ``` `is_null()` 本身是设计来检测变量的值是否为 null 的,但是,如果变量没有定义,会不会报错? ```php // 传入一个未定义的变量,确实会报错 is_null($var); // 未定义变量: var ``` 通过查找资料,你可能会看到传入一个未定义的变量时,也许不会报错,这是 PHP 的错误报告级别设置在起作用 我们不应去降低错误处理机制,使其支持传入未定义变量不会报错,这种处理方案是不合适的,更好的解决方案: ```php // 未定义的变量被视为 null $result = isset($var) ? is_null($var) : true; ``` `is_null()` 函数的设计也只支持接收单个参数,它的函数原型是: ```php bool is_null ( mixed $var ) ``` #### 4. 区别总结 --- `isset()`、`empty()`、`is_null()` 是 PHP 中三个常用的变量检测函数,它们在功能和使用场景上有明显区别 相同点:都是用于检测变量或数据的函数,返回值都是布尔类型 不同点,从功能上: + isset() 用于判断变量是否存在,当变量存在并且值不为 null 时,返回 true + empty() 用于判断数据是否为空,数据为空的情况有:空字符串、字符串 0、0、false、null、空数组、变量未定义 + is_null() 用于判断变量的值是否为 null,变量未定义时会报错 不同点,从语法上: + isset() 的参数支持接收多个变量,并且参数只能是变量,不能是字面量、表达式 + empty() 和 is_null() 的参数,只能传入一个变量,从 php 5.5 开始,不仅可以是变量,也可以是字面量、表达式 + isset() 和 empty() 的变量未定义也不会报错,is_null() 会报错,如果没有报错,就是因为错误级别设置的比较低