我们知道PHP是动态类型绑定的,声明和定义一个变量的时候完全不用关心它的类型,这虽然很方便,但是这就意味着我们对一个变量的类型完全不可知。比如在函数里面,如果不考虑参数的类型的话,很有可能引起程序错误。
以下的测试结果基于 PHP7.16
基本类型检测
使用 gettype() 函数
通过比较 gettype(var) == ‘boolean’ 判断变量var 的类型是否位布尔类型。gettype() 的结果可能为一下几种:
- boolean :布尔
- integer: 整形
- double: 浮点,包括 float 和 double
- string: 字符串
- array: 数组
- object: 对象
- NULL: 空值(PHP4以上特性)
- resource:资源(PHP4以上特性)
- unknown type: 未知类型
echo gettype(var); // 输出 NULLvar = true; echo gettype(var); // 输出 boolean echo "\n";var = 1214123444; echo gettype(var); // 输出 integer, 单整数过大时,输出 double echo "\n";var = 43.6; echo gettype(var); // 输出 double echo "\n";var = ''; echo gettype(var); // 输出 string echo "\n";var = []; echo gettype(var); // 输出 array echo "\n";var = NULL; echo gettype(var); // 输出 NULL echo "\n";var = new stdClass(); // 输出 object echo gettype($var); echo "\n";
在未定义变量的情况下,使用 gettype() 函数输出 NULL,并抛出Notice,但是程序会继续往下执行
使用 is_array系列函数
使用这种方法比上一种方法更加简洁些,直接判断返回值是否为 true 就可以确定变量是不是需要的类型了。
- is_bool(): 布尔
- is_numeric(),is_int(), is_integer(): 整形或则数字字符串
- is_float(),is_double(),is_real(): 浮点
- is_string(): 字符串
- is_object(): 对象
- is_array(): 数组
- is_null(): 空值
对象检测
使用 gettype() 函数和 is_object() 函数只能判断给定变量是否为对象,但有的时候我们还需要判断具体是哪一个对象。
- get_class()返回对象具体是哪一种对象,返回类名的字符串
- get_class_methods(class_var) 返回class_var对象的所有 public 的方法
- is_a(class_var,className) 如果对象 class_var 派生自或者就是className 定义的类,则返回 true
- property_exists(class_var,property_name) 检测对象 class_var 中是否有名为property_name 的属性, 有则返回 true
- a instancdof b 语法特性,检测对象 a 是否派生自 b,是则返回 true
class TestClass{ public game; privateparams; public function __construct(params = 'test') {this->params = params; } public function get_params() { returnthis->params; } protected function set_params(params) {this->params = params; } }param_test = new TestClass(); echo gettype(param_test); // 输出 object echo "\n"; echo get_class(param_test); // 输出 TestClass echo "\n"; var_dump(get_class_methods(param_test)); // 输出方法数组 var_dump(is_a(param_test, 'TestClass')); // 输出 true var_dump(property_exists(param_test, 'params')); // 输出 true, 能够检测 private 的属性 var_dump(param_test instanceof $param_test); // 输出 true, 前后必须为变量
数组检测
array_key_exists(key,array) 检测数组中是否包含某个键
in_array(value,array) 检测数组中是否包含某个值
$params = ['game' => 'test', 'web' => true]; echo array_key_exists('game', $params); // 输出 1 echo in_array('test', $params); // 输入 1