• 认真地记录技术中遇到的坑!

PHP类型检测

PHP 悠悠 2年前 (2017-07-27) 522次浏览 0个评论

我们知道PHP是动态类型绑定的,声明和定义一个变量的时候完全不用关心它的类型,这虽然很方便,但是这就意味着我们对一个变量的类型完全不可知。比如在函数里面,如果不考虑参数的类型的话,很有可能引起程序错误。

以下的测试结果基于 PHP7.16

基本类型检测

使用 gettype() 函数

通过比较  gettype($var) == ‘boolean’  判断变量 $var 的类型是否位布尔类型。gettype() 的结果可能为一下几种:

  1. boolean :布尔
  2. integer:   整形
  3. double:   浮点,包括 float 和 double
  4. string:     字符串
  5. array:      数组
  6. object:    对象
  7. NULL:     空值(PHP4以上特性)
  8. resource:资源(PHP4以上特性)
  9. unknown type: 未知类型
echo gettype($var);  // 输出 NULL
$var = 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 就可以确定变量是不是需要的类型了。

  1. is_bool():        布尔
  2. is_numeric(),is_int(), is_integer():  整形或则数字字符串
  3. is_float(),is_double(),is_real():     浮点
  4. is_string():      字符串
  5. is_object():     对象
  6. is_array():       数组
  7. is_null():         空值

对象检测

使用 gettype() 函数和 is_object() 函数只能判断给定变量是否为对象,但有的时候我们还需要判断具体是哪一个对象。

  1. get_class()返回对象具体是哪一种对象,返回类名的字符串
  2. get_class_methods($class_var)  返回 $class_var对象的所有 public 的方法
  3. is_a($class_var, $className)    如果对象 $class_var 派生自或者就是 $className 定义的类,则返回 true
  4. property_exists($class_var, $property_name)  检测对象 $class_var 中是否有名为 $property_name 的属性, 有则返回 true
  5. a instancdof b  语法特性,检测对象 a 是否派生自 b,是则返回 true
class TestClass{
    public $game;
    private $params;
    public function __construct($params = 'test')
    {
        $this->params = $params;
    }
    public function get_params()
    {
        return $this->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

转载请注明出处 PHP类型检测
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址