代码改变世界

详细介绍:PHP基础-数据类型(第九天)

2025-09-22 17:07  tlnshuju  阅读(19)  评论(0)    收藏  举报

PHP数据类型

参考:https://www.php.net/manual/zh/language.types.intro.php

一.php有几种数据类型呢?

数据类型 data type,在php找那个值得是存储的数据本身的类型,而不是变量的类型,PHP是一种弱类型语言(动态类型语言)

  • 数据类型 (data type) 指的是 值本身的类型,比如整数 1int,字符串 "abc"string,数组 [1,2,3]array

  • 变量 (variable) 本身没有固定类型,变量只是一个“容器”,里面放的值是什么类型,就临时决定了变量的类型。

  • PHP 是动态类型语言,这意味着默认不需要指定变量的类型,因为会在运行时确定

  • 可以通过使用类型声明对语言的一些方面进行类型静态化。可以在类型系统页面找到 PHP 类型系统支持的不同类型

例如:

$x = 123;
// int
$x = "hello";
// 现在是 string
$x = [1,2,3];
// 现在是 array

PHP将数据分成三大类八个小类

1.1、标量(Scalar) — 基本(简单)类型

  1. 整型(integer / int)
    • 例如:1-1000xFF
    • 系统分配4个字节储存,表示整数类型
  2. 浮点型(浮点数 float / 双精度数 double /实数real)
    • 例如:3.142.5e3
    • 系统分配8个字节储存,表示小数或整型存不下的整数
  3. 布尔型(boolean / bool)
    • 只有两个值:true / false
    • bool()函数
  4. 字符串(string)
    • 例如:"hello"'PHP'
    • 系统根据实际长度分配

1.2、复合(Compound) — 容器类型

  1. 数组(array)
    • 可以存储多个值,可以是数字索引或关联键
    • 例如:[1,2,3]['name'=>'Tom']
  2. 对象(object)
    • 类的实例
    • 例如:$obj = new stdClass(); $obj->name = 'Tom';

1.3、特殊(Special)

  1. 资源(resource)

    • PHP外部资源的引用,例如数据库连接、文件句柄
    • 例如:$fp = fopen('file.txt', 'r');
  2. NULL

    • 表示变量没有值

    • 只有一个值null (不能运算),不区分大小写的常量 null /NULL

    • 例如:$var = null;

    • 未定义和 unset() 的变量都将解析为值 null

    • Is_null 函数

      • is_null(mixed$value): bool
      • 检测变量是否是 null
    • 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的八种数据类型:

1.5 什么是类型系统?

参考:https://www.php.net/manual/zh/language.types.type-system.php

1.5.1 概念

类型系统是 编程语言用来区分不同类型的数据及其操作规则的机制
它回答两个核心问题:

  1. 一个变量或表达式属于哪种数据类型?
  2. 这个类型可以进行哪些操作?

PHP 7+ 引入了 类型声明(Type Hint / Type Declaration),可以在函数参数、返回值、类属性等处声明类型,例如:

function add(int $a, int $b): int {
return $a + $b;
}
1.5.2 为什么要用类型系统?
  1. 提升代码可读性
    • 其他开发者一眼就知道函数需要什么类型的参数,返回什么类型的数据。
  2. 捕获错误
    • 静态化类型可以在运行时(或静态分析时)发现类型不匹配的情况,减少 bug。
  3. 更安全的代码
    • 防止不小心传入错误类型导致不可预期的行为(例如把数组传给需要整数的函数)。
  4. 支持工具和 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现在可以单独使用 nullfalse
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。

<?php
function &
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 = "";stringtruefalsetruefalse
$x = null;NULLtruetruefalsefalse
var $x;NULLtruetruefalsefalse
$x is undefinedNULLtruetruefalsefalse
$x = [];arraytruefalsetruefalse
$x = ['a', 'b'];arrayfalsefalsetruetrue
$x = false;booleantruefalsetruefalse
$x = true;booleanfalsefalsetruetrue
$x = 1;integerfalsefalsetruetrue
$x = 42;integerfalsefalsetruetrue
$x = 0;integertruefalsetruefalse
$x = -1;integerfalsefalsetruetrue
$x = "1";stringfalsefalsetruetrue
$x = "0";stringtruefalsetruefalse
$x = "-1";stringfalsefalsetruetrue
$x = "php";stringfalsefalsetruetrue
$x = "true";stringfalsefalsetruetrue
$x = "false";stringfalsefalsetruetrue
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 合并)。
      • 数组不能和 整数、字符串、布尔值 等做算术运算。
    • 三元运算符和比较运算符
  • 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"
布尔 booltrue → "1",false → ""(空字符串)echo true;"1"echo false;""
NULL转为 ""(空字符串)echo null;""
字符串 string原样输出echo "php";"php"
数组 arrayWarning: Array to string conversion 输出 "Array"echo [1,2]; → 警告 + "Array"
对象 object如果实现 __toString() 方法 → 返回该方法结果 否则 Warning: Object to string conversionecho 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. 使用场景
  1. echo / print / printf
    • 系统会自动触发字符串转换。
  2. . 拼接运算符
    • 拼接时操作数会尝试转字符串。
  3. 字符串函数参数
    • 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):

原类型转换规则
booltrue → 1, false → 0
null0
string数字开头的字符串 → 转为数字部分;字母开头 → 0
array空数组 → 0;非空数组 → 报错
object不能直接参与算术运算,报错(除非实现 __toString() 并转数字)

示例:

"10 apples" + 5;
// 15
true + 2;
// 3
[] + 1;
// 警告:数组不能转数字
2.字符串上下文触发的类型转换

在字符串拼接或输出中,PHP 会尝试把变量转为字符串:

原类型转换规则
int / float转为对应字符串 "123""3.14"
booltrue → "1",false → ""
null""
array / object直接输出会报错或输出 Array / Object 字符串,或触发 __toString() 方法
echo 10;
// "10"
echo true;
// "1"
echo false;
// ""
echo null;
// ""
3.函数参数或返回值触发的类型转换
  • 弱类型函数(没有声明类型):
    • PHP 会尽量自动转换参数类型,比如把字符串 "123" 当作整数传入。
  • 严格类型函数(声明了 declare(strict_types=1);):
    • 不会自动转换类型,类型不符会报错。
function add(int $a, int $b) {
return $a + $b;
}
add("10", 5);
// 弱类型模式:10 + 5 = 15
4.逻辑运算触发的类型转换

逻辑运算符 && || ! 会把操作数转为布尔值:

原类型转换为布尔
int0 → false,其余 true
float0.0 → false,其余 true
string空串、“0” → false,其余 true
array空数组 → false,非空数组 → true
nullfalse
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 系统默认的字符串上下文类型转换

字符串上下文echoprint. 拼接等)里,PHP 会 自动尝试把操作数转换为字符串

原类型系统默认转换规则
int / float转为对应字符串 "123""3.14"
booltrue → "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.特点
  1. 直接修改原变量
    • 不像 (int)$var(bool)$var 只是生成临时值,settype() 会改变 $var 本身的类型。
  2. 返回值
    • 返回 true(总是成功),不会返回转换后的值。
  3. 可用于类型判断 + 转换
    • 如果想在使用前确保类型,可以用 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 = "";stringtruefalsetruefalse
$x = null;NULLtruetruefalsefalse
var $x;NULLtruetruefalsefalse
$x is undefinedNULLtruetruefalsefalse
$x = [];arraytruefalsetruefalse
$x = ['a', 'b'];arrayfalsefalsetruetrue
$x = false;booleantruefalsetruefalse
$x = true;booleanfalsefalsetruetrue
$x = 1;integerfalsefalsetruetrue
$x = 42;integerfalsefalsetruetrue
$x = 0;integertruefalsetruefalse
$x = -1;integerfalsefalsetruetrue
$x = "1";stringfalsefalsetruetrue
$x = "0";stringtruefalsetruefalse
$x = "-1";stringfalsefalsetruetrue
$x = "php";stringfalsefalsetruetrue
$x = "true";stringfalsefalsetruetrue
$x = "false";stringfalsefalsetruetrue