数据类型对应方法参考
官方手册所有类型参考: https://www.php.net/manual/zh/language.types.php
官方手册所有函数参考: https://www.php.net/manual/zh/funcref.php
数据类型
标量类型
php
<?php
$count = 100; // int 类型
$price = 1.5; // float 类型
$str = "hello"; // string 类型
$empty = null; // null 类型, 只有这一个取值引用类型
php
<?php
$arr = array("a", "b", "c"); // 数组
$obj = new StdClass(); // 对象(先不用管 StdClass 是做什么的)
echo "<pre>";
var_dump($arr);
var_dump($obj);
echo "</pre>";
// resource 资源类型: 由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄
// 在这里不好演示, 后续遇到在学习不迟, 只需要知道有这么一个类型就可以了
//
// never/void 类型: 这是一个新版本提出的又一个特殊类型, 比如, 用于标注函数没有返回值
// 作用有点类似 python 的 None 和 JS 的 undefined自定义类型
或者叫: 类类型 听着绕口, 意思是: 类似原生类型的自定义类型
- 接口
- 类
- 枚举
这个可以先不用纠结它是什么, 等学到对应的章节再学习不迟
callable 类型
与 JS 一样, 在 php 中, 函数也是一等公民, 所以就有了这个 可调用内容的类型, 说明白点就相当于 函数类型
获取变量类型函数
| 函数 | 用途 | 示例 |
|---|---|---|
gettype() | 获取变量的类型名称字符串 | gettype("hello") 输出 "string" |
var_dump() | 直接输出变量的类型及变量的值 | var_dump("hello") 输出 string "hello" |
php
<?php
$num = 11;
echo gettype($num); // integer
echo "<br/>";
$flt = 1.1;
echo gettype($flt); // double
echo "<br/>";
$str = "hello";
echo gettype($str); // string
echo "<br/>";
$bol = false;
echo gettype($bol); // boolean
echo "<br/>";
$nul = null;
echo gettype($nul); // NULL
echo "<br/>";
$arr = array("a", "b", "c");
echo gettype($arr); // array
echo "<br/>";
$obj = new StdClass();
echo gettype($obj); // object
echo "<br/>";判断变量类型函数
都说是判断了, 肯定全部返回 bool 值了
| 函数 | 用途 | 示例 |
|---|---|---|
is_string() | 检查是否为字符串 | is_string("hello") → true |
is_int()/is_integer() | 检查是否为整数 | is_int(42) → true |
is_float()/is_double() | 检查是否为浮点数 | is_float(3.14) → true |
is_bool() | 检查是否为布尔值 | is_bool(true) → true |
is_array() | 检查是否为数组 | is_array([1,2]) → true |
is_object() | 检查是否为对象 | is_object(new stdClass()) → true |
is_null() | 检查是否为null | is_null(null) → true |
is_resource() | 检查是否为资源 | is_resource(fopen('file.txt','r')) → true |
is_callable() | 检查是否可调用(注意参数是函数名字符串) | is_callable('strlen') → true |
is_numeric() | 检查是否为数值或数值字符串 | is_numeric("123") → true |
注意使用这些函数的注意点:
- 资源类型:
gettype()对资源类型返回 "resource",但不同资源类型无法区分, 比如数据库链接和打开文件句柄都是资源类型 - 类型判断性能:
is_*系列函数比gettype()性能更好,应优先使用
转换数据类型
显示转换
手动的转换变量的类型
使用关键字
| 转换类型 | 语法 | 示例 |
|---|---|---|
| 整型 | (int) 或 (integer) | (int)"123" → 123 |
| 浮点型 | (float), (double) 或 (real) | (float)"3.14" → 3.14 |
| 字符串 | (string) | (string)42 → "42" |
| 布尔型 | (bool) 或 (boolean) | (bool)"" → false |
| 数组 | (array) | (array)"text" → ["text"] |
| 对象 | (object) | (object)["a" => 1] → 对象 |
| NULL | (unset) | (unset)$var → null |
php
<?php
// 字符串转数字
$number = (int)"42 cats"; // 42 (会忽略非数字部分)
$float = (float)"3.1415"; // 3.1415
// 数字转字符串
$string = (string)123; // "123"
// 布尔转换
$trueVal = (bool)"0"; // true (非空字符串为true)
$falseVal = (bool)""; // false (空字符串为false)
// 复杂类型转换
$array = (array)"hello"; // ["hello"]
$obj = (object)["key" => "value"]; // 对象 with property key使用内置函数转换
| 函数 | 用途 | 示例 |
|---|---|---|
intval() | 转换为整数 | intval("42", 10) → 42 |
floatval() | 转换为浮点数 | floatval("3.14") → 3.14 |
strval() | 转换为字符串 | strval(123) → "123" |
boolval() (PHP 5.5+) | 转换为布尔值 | boolval("") → false |
settype() | 设置变量类型 | settype($var, "integer") |
php
<?php
// 使用转换函数
$num = intval("123.45"); // 123 (截断小数部分)
$float = floatval("3.14abc"); // 3.14 (忽略非数字部分)
$str = strval(true); // "1" (true转为"1", false转为"")
// settype() 会改变原变量类型
$var = "123";
settype($var, "integer"); // $var 现在是整数 123
// boolval() 示例 (PHP 5.5+)
var_dump(boolval([])); // false
var_dump(boolval([1])); // true隐式类型转换
弱类型语言的局限性, 为了便捷性而做出的取舍, 这点 JS 和 python 也一样
php
<?php
// 字符串 + 数字 = 数字
$res = "10" + 5; // (int) 15 (说明字符串"10"被转换为整数然后计算)
// 字符串连接(数字转为字符串)
$res2 = "10" . 5; // (string) "105" (说明 5 被转换为字符串然后拼接)类型转换陷阱与注意事项
- 字符串到数字的转换:
php
<?php
$res1 = (int)"123abc"; // 123 (忽略非数字部分)
$res2 = (int)"abc123"; // 0 (无法转换)布尔转换规则:
- 转换为
false的值:0,0.0,"","0",[],null,false - 其他所有值转换为
true
- 转换为
浮点精度问题:
php
<?php
$res = (int)(0.1 + 0.7) * 10; // 7(不是8, 因为浮点计算精度问题)- 对象转换限制:
php
<?php
$array = (array)new DateTime();
// 可以转换但内部属性处理复杂, 不推荐这么做,
// 这代码看起来全是魔法, 可读性太差了, 建议手动处理- 资源类型转换:
php
<?php
$resource = fopen("file.txt", "r");
$r_id = (int)$resource; // 资源ID(整数)