闲谈一隅

PHP中的类型转换

PHP跟其他强类型语言不一样,在定义变量时不需要指定变量的类型或者说不支持。变量的类型是根据你赋值给这变量的类型有关。如果你把一个 String 类型的变量赋值给 $var$var 就是字符串类型,然后在将一个 Int 类型赋值给 $var ,那它就是 int 类型。也就说 $var 的类型取决于赋值给它的值的类型。所以不能指定 $var 为一个指定类型,或者说你不能指定 $var 只接受指定的类型 (当然你可以使用强制转换为你要的类型)

PHP中的假值和真值

第一次听到真值和假值是在 《JavaScript权威指南》 这本书中看到的,这是指真值和假值得概念 ,那按照官方文档中所说的假值应该有如下:(当需要转换为 boolean 时,以下值被认为是 FALSE)

  1. 布尔值 FALSE 本身
  2. 整型值 0(零)
  3. 浮点型值 0.0(零)
  4. 空字符串,以及字符串 “0”
  5. 不包括任何元素的数组
  6. 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  7. 特殊类型 NULL(包括尚未赋值的变量)
  8. 从空标记生成的 SimpleXML 对象

其他所有的值都会转换成 true 也就是真值。

-1 和其它非零值(不论正负)一样,被认为是 TRUE!

扩展

判断一个变量是否为空

  1. if ($var) {}
  2. if (empty($var)) {}
1
2
3
4
5
6
7
8
9
10
11
//Apache/2.4.18 (Win32) PHP/7.0.4
var_dump((bool)$a); //Notice: Undefined variable
$a = '';
var_dump((bool)$a); //bool(false)
var_dump(empty($a)); //bool(true)
$a = ' ';
var_dump((bool)$a); //bool(true)
var_dump(empty($a)); //bool(false)

第一个 if ($var) {},if 后面需要一个布尔值来判断是否需要执行下面的代码,所以 PHP 会主动的将 $var 转换为布尔值(已经是bool值得话就不会转了),转换规则就是前面所说的真假值。
第二个 if (empty($var)) {} , empty()会返回一个布尔值,所以我们只要看empty()函数的处理规则

判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于FALSE,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。

以下值会被认为空:

  1. “” (空字符串)
  2. 0 (作为整数的0)
  3. 0.0 (作为浮点数的0)
  4. “0” (作为字符串的0)
  5. NULL
  6. FALSE
  7. array() (一个空数组)
  8. $var; (一个声明了,但是没有值的变量)

根据官方文档中所说它的值等同于FALSE,那么就会被认为不存在,那就会返回 TRUE。那不是跟直接使用第一种方法一样了吗? 但是但是它还说了当该变量不存在时也会返回 TRUE 所以这就是它们的区别。当你用 if 去判断一个不存在的变量是会有个 Notic 的报错,而 empty 并不会报错。恩所以我们在编程的时候为了严谨还是建议使用第二种好 (除非你能保证你需要判断的变量之前肯定声明过)