当前位置: 首页 > news >正文

PHP基础-数据类型(第九天)

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的八种数据类型:

  • 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 概念

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

  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现在可以单独使用 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 = "";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
http://www.dtcms.com/a/390445.html

相关文章:

  • jQuery中的函数与其返回结果
  • 自动化机器学习框架NexusCore1.0稳定版文档概述
  • 五传输层TCPUDP-思考题-停止等待-ARQ-滑动窗口
  • 使用Azure OpenAI Realtime模型实现语音助理
  • 【智能系统项目开发与学习记录】LinuxUbuntuROS2 零基础学习笔记(小白友好版)
  • Python5-线性回归
  • Windows 定时任务设置、批处理(.bat)命令详解和通过conda虚拟环境定时运行Python程序
  • 无人机图传:让画面直达掌心的传输艺术
  • Django HttpRequest 对象的常用属性
  • 常见的 2 中缓存
  • Python基于Django的微博舆情可视化系统 关键词/用户ID/评论分析 大数据项目(建议收藏)✅
  • 四大访问控制模型:OBAC、RBAC、TBAC与ABAC的对比与应用
  • 如何使用AI IDE书写Vue3数据可视化大屏项目
  • React 类名控制工具库ClassName 简化类写法 条件控制 样式处理
  • 【MySQL】用户和权限管理
  • STM32项目分享:游泳馆闸机计费管理系统设计
  • 《C++进阶之STL》【unordered_set/unordered_map 模拟实现】
  • LLM中如何添加special_token,并且尽可能保持原模型的训练效果
  • [x-cmd] 使用系统包管理器安装 x-cmd
  • 亮数据MCP结合Dify:构建自动化视频数据抓取与智能分析工作流的深度实践
  • 革新交互体验,开启未来智慧生活 —— OPE.AI 多语言多模态AI产品
  • 生活琐记(2)
  • 一文读懂HTTP 1.1/2.0/3.0:从原理到应用的通俗解析
  • JavaStream用法全解析
  • 在日常开发中实现异常处理和空值处理的最佳实践
  • openstack port binding failure (by quqi99)
  • leetcode 3484. 设计电子表格 中等
  • Docker+cpolar 实战:打造灵活可控的远程办公系统
  • uniApp开发XR-Frame微信小程序 | 设置透明贴图
  • M3 Ultra版Mac Studio无法正常升级到macOS 26.0 苹果已经在调查