PHP基础-数据类型(第九天)
PHP数据类型
参考:https://www.php.net/manual/zh/language.types.intro.php
一.php有几种数据类型呢?
数据类型 data type,在php找那个值得是存储的数据本身的类型,而不是变量的类型,PHP是一种弱类型语言(动态类型语言)
-
数据类型 (data type) 指的是 值本身的类型,比如整数
1
是int
,字符串"abc"
是string
,数组[1,2,3]
是array
。 -
变量 (variable) 本身没有固定类型,变量只是一个“容器”,里面放的值是什么类型,就临时决定了变量的类型。
-
PHP 是动态类型语言,这意味着默认不需要指定变量的类型,因为会在运行时确定
-
可以通过使用类型声明对语言的一些方面进行类型静态化。可以在类型系统页面找到 PHP 类型系统支持的不同类型
例如:
$x = 123; // int
$x = "hello"; // 现在是 string
$x = [1,2,3]; // 现在是 array
PHP将数据分成三大类八个小类
1.1、标量(Scalar) — 基本(简单)类型
- 整型(integer / int)
- 例如:
1
、-100
、0xFF
- 系统分配4个字节储存,表示整数类型
- 例如:
- 浮点型(浮点数 float / 双精度数 double /实数real)
- 例如:
3.14
、2.5e3
- 系统分配8个字节储存,表示小数或整型存不下的整数
- 例如:
- 布尔型(boolean / bool)
- 只有两个值:
true
/false
- bool()函数
- 只有两个值:
- 字符串(string)
- 例如:
"hello"
、'PHP'
- 系统根据实际长度分配
- 例如:
1.2、复合(Compound) — 容器类型
- 数组(array)
- 可以存储多个值,可以是数字索引或关联键
- 例如:
[1,2,3]
或['name'=>'Tom']
- 对象(object)
- 类的实例
- 例如:
$obj = new stdClass(); $obj->name = 'Tom';
1.3、特殊(Special)
-
资源(resource)
- PHP外部资源的引用,例如数据库连接、文件句柄
- 例如:
$fp = fopen('file.txt', 'r');
-
NULL
-
表示变量没有值
-
只有一个值null (不能运算),不区分大小写的常量
null
/NULL -
例如:
$var = null;
-
未定义和 unset() 的变量都将解析为值
null
。 -
Is_null 函数
- is_null(mixed
$value
): bool - 检测变量是否是
null
。
- is_null(mixed
-
unset 函数
-
unset(mixed
$var
, mixed...$vars
): void -
unset() 销毁指定变量。
-
,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。 -
<?php function destroy_foo() {global $foo;unset($foo); }$foo = 'bar'; destroy_foo(); echo $foo; ?>
-
结果如图所示
-
// 销毁单个变量 unset($foo);// 销毁单个数组元素 unset($bar['quux']);// 销毁一个以上的变量 unset($foo1, $foo2, $foo3);
-
-
1.4 PHP的八种数据类型:
- null
- bool
- int
- float(浮点数)
- string
- array
- object
- callable
- resource
1.5 什么是类型系统?
参考:https://www.php.net/manual/zh/language.types.type-system.php
1.5.1 概念
类型系统是 编程语言用来区分不同类型的数据及其操作规则的机制。
它回答两个核心问题:
- 一个变量或表达式属于哪种数据类型?
- 这个类型可以进行哪些操作?
PHP 7+ 引入了 类型声明(Type Hint / Type Declaration),可以在函数参数、返回值、类属性等处声明类型,例如:
function add(int $a, int $b): int {return $a + $b;
}
1.5.2 为什么要用类型系统?
- 提升代码可读性
- 其他开发者一眼就知道函数需要什么类型的参数,返回什么类型的数据。
- 捕获错误
- 静态化类型可以在运行时(或静态分析时)发现类型不匹配的情况,减少 bug。
- 更安全的代码
- 防止不小心传入错误类型导致不可预期的行为(例如把数组传给需要整数的函数)。
- 支持工具和 IDE
- 静态类型说明可以让 IDE 自动补全、类型检查、静态分析,提高开发效率。
类型系统有助于:
- 提示程序员如何正确使用变量
- 在运行时或编译期捕获类型错误
- 提升代码可读性和可维护性
1.5.3 小结
特点 | PHP 默认 | 静态化类型说明 |
---|---|---|
类型检查 | 弱类型,运行时自动转换 | 明确要求参数/返回值类型,减少出错 |
作用 | 灵活,但可能出错 | 提升安全性、可读性、可维护性 |
1.5.4 支持情况
8.3.0 | 新增了对类、接口、trait 和枚举常量类型的支持。 |
---|---|
8.2.0 | 新增对 DNF 类型的支持。 |
8.2.0 | 新增对 literal 类型 true 的支持。 |
8.2.0 | 现在可以单独使用 null 和 false。 |
8.1.0 | 新增对交集类型的支持。 |
8.1.0 | 弃用 void 函数通过引用返回。 |
8.1.0 | 新增对返回类型 never 的支持。 |
8.0.0 | 新增对 mixed 类型的支持。 |
8.0.0 | 新增对返回类型 static 的支持。 |
8.0.0 | 新增对联合类型的支持。 |
7.4.0 | 新增对类属性类型化的支持。 |
7.2.0 | 新增对 object 类型的支持。 |
7.1.0 | 新增对 iterable 类型的支持。 |
7.1.0 | 新增对 void 类型的支持。 |
7.1.0 | 新增对可为 null 类型的支持。 |
1.5.5 注意:
从 PHP 8.1.0 起弃用 void 函数通过引用返回,因为这样的函数自相矛盾。在此之前调用时总是会发出如下 E_NOTICE
:Only variable references should be returned by reference。
<?phpfunction &test(): void {}
?>
二.类型如何转换?
参考:https://www.php.net/manual/zh/types.comparisons.php
类型转换:很多条件下,需要指定的数据类型,需要外部数据(PHP取得的数据)转换成目标数据类型
在PHP中有两种类型转换方式:
2.1 方式一自动转换
1.系统根据需求自己判定
2.自己转换(用的比较多,效率偏低)
3.转换过程中 用的比较多的就是布尔类型(判断)和转数据类型(算数运算)
2.1.1其他类型转布尔类型:
在php中用比较类型进行转换 :
主要看表达式和boolean抓换
表达式 | gettype() | empty() | is_null() | isset() | boolean : if($x) |
---|---|---|---|---|---|
$x = ""; | string | true | false | true | false |
$x = null; | NULL | true | true | false | false |
var $x; | NULL | true | true | false | false |
$x is undefined | NULL | true | true | false | false |
$x = []; | array | true | false | true | false |
$x = ['a', 'b']; | array | false | false | true | true |
$x = false; | boolean | true | false | true | false |
$x = true; | boolean | false | false | true | true |
$x = 1; | integer | false | false | true | true |
$x = 42; | integer | false | false | true | true |
$x = 0; | integer | true | false | true | false |
$x = -1; | integer | false | false | true | true |
$x = "1"; | string | false | false | true | true |
$x = "0"; | string | true | false | true | false |
$x = "-1"; | string | false | false | true | true |
$x = "php"; | string | false | false | true | true |
$x = "true"; | string | false | false | true | true |
$x = "false"; | string | false | false | true | true |
1.系统默认触发转换的情况:
- 条件判断 if while,三元表达式
- 逻辑运算 && || ?
2.false的情况
- string:空字符串”“ ,“0”
- Array:空数组
- int 数值:0
- NULL 变量未定义 ,null
3.示例
if ("0") {echo "true" . " string '0'";echo "<br/>";
} else {echo "false" . " string '0'";echo "<br/>";
}
if ("") {echo "true" . " string 空字符串''";echo "<br/>";
} else {echo "false" . " string 空字符串 ''";echo "<br/>";
}
if ([]) {echo "true" . " Array 空数组[]";echo "<br/>";
} else {echo "false" . " Array 空数组[]";echo "<br/>";
}
if (0) {echo "true" . " init 0";echo "<br/>";
} else {echo "false" . " init 0";echo "<br/>";
}
结果如下
4.注意
$b = $a && true;
print_r($b); //false 所以输出为空字符串''
echo "<br/>";
echo 'a = b && true=' . $b . '结束了' . '<br/>';
$b = $a || true;1
print_r($b);//true 所以输出为1
echo "<br/>";
echo 'a = b && true=' . $b . '结束了' . '<br/>'; //将false 转换成了数字1
结果如下:
现在用var_dump打印更清楚:
// 逻辑运算
$b = $a && true;
var_dump($b);
echo "<br />";$b = $a || true;
var_dump($b);
echo "<br />";// 不同类型输出
$a = 123;
$b = 1.5;
$c = true;
$d = false;
$e = null;
$f = [1, 2];
$g = new stdClass();var_dump($a);
echo "<br />";
var_dump($b);
echo "<br />";
var_dump($c);
echo "<br />";
var_dump($d);
echo "<br />";
var_dump($e);
echo "<br />";
var_dump($f);
echo "<br />";
var_dump($g);
echo "<br />";
结果如图:
原理:
.
运算符要求字符串。
系统会尝试把 $a
转成字符串:
true
→"1"
false
→""
(空字符串)
因为 $a = false
→ 转成空字符串 → 所以你看到打印内容为空
2.1.2 其他类型转数值的说明
1.系统默认触发转换的情况:
-
算术+运算,系统先转换成数值 (+,-,/,*…)
-
数组访问触发类型转换,会把键名自动转换为整数或字符串
-
$arr = []; $arr[1.5] = "a"; // key 1.5 → 1 $arr[true] = "b"; // key true → 1
-
2.转换规则
-
boolean true =>1 false =>0
-
string
- 以字母开头的字符串 =>0
- 以数字开头的字符串,取到碰到字符串为止(不会同事包含两个小数点)
- PHP 8 之后很严格,如果字符串不是“纯数字开头”,就不允许直接和数字做
+
运算,会直接抛TypeError
警告和 Deprecated 并不是“致命错误”,程序会继续执行,只是提醒你。
-
nul l=> 0
-
Array []空数组=>0 非空=>1
- 在 PHP 里:
+
对 数组 只能和 数组 相加(结果是数组的合并,注意不是数值相加,而是 key 合并)。- 数组不能和 整数、字符串、布尔值 等做算术运算。
- 三元运算符和比较运算符
- 在 PHP 里:
-
Object _toString 方法存在则用返回值转换,否则报错
-
resource =>转换为对应资源ID(整数)
3.注意:
PHP 8 开始对 算术运算中非数值字符串 或 非整型数组下标 更严格了:
-
"0SASDF" + 1
:PHP 以前会默默把非数字字符忽略,算出结果。 -
PHP 8 起会 触发 Warning:
Warning: A non-numeric value encountered
→ 提醒你这种行为可能不是你想要的,代码可能存在潜在 bug。
-
浮点数组下标:
$arr[1.5] = 2;
如图所示:
2.1.3其他类型转换为字符串
在 字符串上下文(如 echo
、.
拼接)中,PHP 会尝试把各种类型自动转换为字符串。不同类型转换规则如下:
原类型 | 系统默认转换规则(字符串上下文) | 示例 |
---|---|---|
整数 int | 直接转为对应字符串 "123" | echo 42; → 输出 "42" |
浮点 float | 直接转为对应字符串 "3.14" | echo 1.5; → 输出 "1.5" |
布尔 bool | true → "1" ,false → "" (空字符串) | echo true; → "1" echo false; → "" |
NULL | 转为 "" (空字符串) | echo null; → "" |
字符串 string | 原样输出 | echo "php"; → "php" |
数组 array | Warning: Array to string conversion 输出 "Array" | echo [1,2]; → 警告 + "Array" |
对象 object | 如果实现 __toString() 方法 → 返回该方法结果 否则 Warning: Object to string conversion | echo new stdClass(); → 警告 + "Object" class A{ function __toString(){ return "ok"; } } echo new A(); → "ok" |
资源 resource | 转为对应资源 ID(整数)再转字符串 | $fp = fopen("test.txt","r"); echo $fp; → "Resource id #3" |
未定义变量 / var $x; | 转为 NULL → 空字符串 "" | echo $undefinedVar; → 警告 + "" |
1. 使用场景
- echo / print / printf
- 系统会自动触发字符串转换。
.
拼接运算符- 拼接时操作数会尝试转字符串。
- 字符串函数参数
- 如
strlen($var)
会先将$var
转成字符串。
- 如
2. 示例
$a = 123;
$b = 1.5;
$c = true;
$d = false;
$e = null;
$f = [1,2];
$g = new stdClass();echo $a; // "123"
echo $b; // "1.5"
echo $c; // "1"
echo $d; // ""
echo $e; // ""
echo $f; // Warning + "Array"
echo $g; // Warning + "Object"
如图所示:
3. 注意事项
- 数组和对象 不能直接当字符串,否则会触发 Warning。
- 布尔 false / null / 未定义变量 转为字符串是空字符串
""
,容易造成拼接结果看起来“空白”。 - 对象要安全输出,建议实现
__toString()
方法或者用json_encode
/print_r
。
2.1.3 系统默认触发情况总结
1.算术运算触发的类型转换
当进行 + - * / %
等算术运算时,PHP 会自动把操作数转换为数值(integer 或 float):
原类型 | 转换规则 |
---|---|
bool | true → 1, false → 0 |
null | 0 |
string | 数字开头的字符串 → 转为数字部分;字母开头 → 0 |
array | 空数组 → 0;非空数组 → 报错 |
object | 不能直接参与算术运算,报错(除非实现 __toString() 并转数字) |
示例:
"10 apples" + 5; // 15
true + 2; // 3
[] + 1; // 警告:数组不能转数字
2.字符串上下文触发的类型转换
在字符串拼接或输出中,PHP 会尝试把变量转为字符串:
原类型 | 转换规则 |
---|---|
int / float | 转为对应字符串 "123" 、"3.14" |
bool | true → "1" ,false → "" |
null | "" |
array / object | 直接输出会报错或输出 Array / Object 字符串,或触发 __toString() 方法 |
echo 10; // "10"
echo true; // "1"
echo false; // ""
echo null; // ""
3.函数参数或返回值触发的类型转换
- 弱类型函数(没有声明类型):
- PHP 会尽量自动转换参数类型,比如把字符串
"123"
当作整数传入。
- PHP 会尽量自动转换参数类型,比如把字符串
- 严格类型函数(声明了
declare(strict_types=1);
):- 不会自动转换类型,类型不符会报错。
function add(int $a, int $b) {return $a + $b;
}
add("10", 5); // 弱类型模式:10 + 5 = 15
4.逻辑运算触发的类型转换
逻辑运算符 && || !
会把操作数转为布尔值:
原类型 | 转换为布尔 |
---|---|
int | 0 → false,其余 true |
float | 0.0 → false,其余 true |
string | 空串、“0” → false,其余 true |
array | 空数组 → false,非空数组 → true |
null | false |
object | 总是 true(除非实现 __isset() / 特殊逻辑) |
$val = "0" && 123; // "0" 转 false → false && true → false
$val = [] || 1; // [] 转 false → false || true → true
5. 数组访问触发的类型转换
当使用非整数键访问数组时,PHP 会把键自动转换为整数或字符串:
$arr = [];
$arr[1.5] = "a"; // key 1.5 → 1
$arr[true] = "b"; // key true → 1
6. 比较运算符触发的类型转换
比较运算符 == != < > <= >=
会触发 松散比较规则(弱类型对比)。
- 如果一边是 数字,另一边会被转为数字。
- 如果一边是 布尔,另一边会被转为布尔。
- 如果两边都是字符串,则按字符串比较。
- 数组与非数组比较,结果固定为 false(除非数组和数组比较)。
var_dump("10" == 10); // true (字符串转数字)
var_dump("10a" == 10); // true ("10a" → 10)
var_dump([] == false); // true (空数组 → false)
var_dump([1] == true); // true (非空数组 → true)
var_dump([] == 0); // true (空数组 → false → 0)
注意:=== !==
是严格比较,不触发类型转换。
7. 三元运算符触发的类型转换
三元运算符 ?:
会把条件部分转为布尔值(与逻辑运算一致)。
$arr = [];
echo $arr ? "yes" : "no"; // 输出 "no"$str = "0";
echo $str ? "yes" : "no"; // 输出 "no"("0" 转 false)$num = 123;
echo $num ? "yes" : "no"; // 输出 "yes"
8.PHP 系统默认的字符串上下文类型转换
在 字符串上下文(echo
、print
、.
拼接等)里,PHP 会 自动尝试把操作数转换为字符串:
原类型 | 系统默认转换规则 |
---|---|
int / float | 转为对应字符串 "123" 、"3.14" |
bool | true → "1" ,false → "" |
null | "" |
string | 原样输出 |
array | 不能直接转换 → Warning + 输出 "Array" |
object | 实现 __toString() → 调用该方法,否则 Warning + "Object" |
2.2 方式二强制(手动)转换
2.2.1 (xxx类型)
语法:
(float/int)$var
2.2.2 settype()
— 强制修改变量类型
语法:
settype(mixed &$var, string $type): bool
示例:
$var = "123";
settype($var, "int"); // 强制转为整型
echo gettype($var); // integer
echo $var; // 123
1. 支持的类型
类型字符串 | 含义 |
---|---|
"boolean" / "bool" | 布尔类型 |
"integer" / "int" | 整型 |
"float" / "double" / "real" | 浮点型 |
"string" | 字符串 |
"array" | 数组 |
"object" | 对象 |
2. 用法示例
$var = "42.5";// 转为整型
settype($var, "int");
var_dump($var); // int(42)// 转为浮点
$var = "42.5";
settype($var, "float");
var_dump($var); // float(42.5)// 转为布尔
$var = 0;
settype($var, "bool");
var_dump($var); // bool(false)
3.特点
- 直接修改原变量
- 不像
(int)$var
、(bool)$var
只是生成临时值,settype()
会改变$var
本身的类型。
- 不像
- 返回值
- 返回
true
(总是成功),不会返回转换后的值。
- 返回
- 可用于类型判断 + 转换
- 如果想在使用前确保类型,可以用
settype()
。
- 如果想在使用前确保类型,可以用
4. 与 (int) / (bool) / (float)
的区别
比较点 | (type) 强制转换 | settype() |
---|---|---|
作用 | 生成临时值 | 直接修改原变量 |
返回值 | 转换后的值 | 总是 true |
使用场景 | 临时转换/计算 | 改变变量类型 |
5.示例结合布尔逻辑
$a = [];
settype($a, "bool");
var_dump($a); // bool(false)$a = "0";
settype($a, "bool");
var_dump($a); // bool(false)
- 可以配合你的 布尔转换表 使用,确保变量类型在逻辑判断前正确。
三.类型如何判断?
3.1 gettype()
— 获取变量类型
用法:
gettype(mixed $value): string
示例
$var = 123;
echo gettype($var); // "integer"$var = "hello";
echo gettype($var); // "string"
常见返回值:
返回值 | 类型说明 |
---|---|
boolean | 布尔类型 |
integer | 整型 |
double | 浮点型(float) |
string | 字符串 |
array | 数组 |
object | 对象 |
resource | 资源 |
NULL | 空值 |
unknown type | 未知类型(PHP7+ 很少出现) |
3.2 is_*
系列函数 — 判断是否为某种类型
函数 | 用法示例 | 返回值 |
---|---|---|
is_int() / is_integer() / is_long() | is_int(123) → true | 布尔值 |
is_float() / is_double() | is_float(3.14) → true | 布尔值 |
is_string() | is_string("abc") → true | 布尔值 |
is_bool() | is_bool(true) → true | 布尔值 |
is_array() | is_array([1,2]) → true | 布尔值 |
is_object() | is_object(new stdClass()) → true | 布尔值 |
is_null() | is_null(null) → true | 布尔值 |
is_resource() | is_resource($fp) → true | 布尔值 |
isset() | isset($var) → true/false | 检查变量是否定义且不为 null |
empty() | empty($var) → true/false | 检查变量是否为“空值”(0、“”、null、false、[] 都算空) |
3.3 强制类型转换(判断前可以先转换)
$var = "123";if (is_numeric($var)) {$intVar = (int)$var; // 转整型
}
is_numeric($var)
:判断是否可以作为数字使用(整数或浮点数的字符串都行)。is_callable($var)
:判断是否可调用(函数名、闭包等)。
3.4 类型判断
示例
$vars = [123, 3.14, "abc", true, null, [1,2], new stdClass(), fopen("test.txt", "r")];foreach ($vars as $v) {echo gettype($v) . " : ";if (is_int($v)) echo "整数";elseif (is_float($v)) echo "浮点";elseif (is_string($v)) echo "字符串";elseif (is_bool($v)) echo "布尔";elseif (is_null($v)) echo "空值";elseif (is_array($v)) echo "数组";elseif (is_object($v)) echo "对象";elseif (is_resource($v)) echo "资源";echo "<br/>";
}
结果如图:
3.5 PHP类型比较
表达式 | gettype() | empty() | is_null() | isset() | boolean : if($x) |
---|---|---|---|---|---|
$x = ""; | string | true | false | true | false |
$x = null; | NULL | true | true | false | false |
var $x; | NULL | true | true | false | false |
$x is undefined | NULL | true | true | false | false |
$x = []; | array | true | false | true | false |
$x = ['a', 'b']; | array | false | false | true | true |
$x = false; | boolean | true | false | true | false |
$x = true; | boolean | false | false | true | true |
$x = 1; | integer | false | false | true | true |
$x = 42; | integer | false | false | true | true |
$x = 0; | integer | true | false | true | false |
$x = -1; | integer | false | false | true | true |
$x = "1"; | string | false | false | true | true |
$x = "0"; | string | true | false | true | false |
$x = "-1"; | string | false | false | true | true |
$x = "php"; | string | false | false | true | true |
$x = "true"; | string | false | false | true | true |
$x = "false"; | string | false | false | true | true |