PHP变量类型有哪些_PHP变量支持的数据类型【汇总】

7次阅读

php变量类型动态决定于运行时值而非声明,$var本身无类型;8种内置类型含标量、复合及特殊类型,strict_types仅约束函数参数与返回值,资源与对象序列化行为迥异。

PHP变量类型有哪些_PHP变量支持的数据类型【汇总】

PHP变量类型不是固定声明的,而是运行时动态决定的

PHP里没有“定义变量类型”这回事,$var 本身不带类型,类型属于它当前存储的值。你赋一个整数,$var 就是 int;改成字符串,立刻变成 String;塞个数组进去,就是 Array。这种动态性是PHP底层实现决定的,不是语法糖或者可选项。

常见错误现象:gettype($var) 返回 "Integer",但稍后 $var = "123",再调用就变 "string";有人误以为 declare(strict_types=1) 能约束变量类型——它只影响函数参数和返回值的类型声明,对普通变量完全无效。

  • 所有变量都以 $ 开头,无需提前声明类型
  • var_dump() 是最靠谱的类型+值查看方式,比 gettype() 多一层结构信息
  • 类型转换靠强制转换(如 (int)$val)或函数(如 intval()),但要注意隐式转换陷阱,比如 "123abc" + 1 得到 124,因为字符串被截断转成数字

8种内置标量与复合类型,其中 NULLResource 最容易误判

PHP官方文档列了8种类型:4个标量(boolintFloatstring)、2个复合(arrayObject)、1个特殊(NULL)、1个资源(resource)。注意 callableiterable伪类型,只用于类型声明,不能用 gettype() 检测出来。

容易踩的坑:NULL 不等于空字符串、0false,但 empty()== 会把它们混为一谈;resource 类型(比如 fopen() 返回值)在 PHP 8.1 后已标记为废弃,且无法用 json_encode() 序列化,直接打印只显示 Resource id #n,必须用对应函数(如 get_resource_type())识别。

立即学习PHP免费学习笔记(深入)”;

  • bool 只有 truefalse 两个值,注意 0""[]null 在松散比较中都算 “falsy”,但它们类型完全不同
  • float 实际是双精度浮点数(IEEE 754),0.1 + 0.2 !== 0.3 是常态,金融计算务必用 bcadd()gmp
  • array 是有序映射表,既是索引数组也是关联数组count() 对空对象返回 0,但对象不是 array

对象和资源类型的行为差异极大,尤其在生命周期和序列化上

object 类型由类实例化而来,自带属性、方法和作用域规则;resource 是外部资源(文件句柄、数据库连接等)的抽象指针,没有方法,也不能直接访问内部数据。两者都不能直接 json_encode(),但原因不同:对象默认只序列化 public 属性,而 resource 根本没有可序列化的结构。

典型问题:fclose() 后继续使用该 resource 变量,gettype() 仍返回 "resource",但后续操作会报 Warning: fwrite(): supplied resource is not a valid stream resource;对象在 unset 后变成 null,但资源关闭后变量依然存在,只是失效了。

  • 判断资源是否有效,用 is_resource($res) && get_resource_type($res) === 'stream',不能只靠 is_resource()
  • 对象要自定义序列化行为,需实现 __serialize()__unserialize()(PHP 7.4+),否则 serialize() 只存 public 属性
  • 资源类型无法 clone,也无法用 === 比较是否指向同一底层资源,只能靠业务逻辑保证生命周期

PHP 8 的 mixednever 是类型声明关键词,不影响运行时变量类型

mixed 表示“可以是任意类型”,never 表示“这个函数不会正常返回”,它们只在函数签名、属性声明或 PHPDoc 中起作用,运行时 gettype() 完全看不到它们。有人在 PHP 8 下写 function foo(): mixed { return new stdClass(); },然后期待 gettype(foo()) 返回 "mixed"——这是不可能的,实际还是 "object"

兼容性提醒:PHP 7.4 引入了 object 类型声明(表示任意对象),但它不等于 stdClass,也不限制具体类名;而 mixed 在 PHP 8.0 才正式支持,低版本用会报错,不能当运行时类型检测依据。

  • 类型声明只校验传参和返回,不影响变量本身的动态性
  • var_export() 输出的是可执行的 PHP 代码,能反映当前值类型print_r() 更适合调试,但对资源只输出占位符
  • 真正需要类型安全的场景,别依赖运行时判断,用严格类型声明 + 静态分析工具(如 PHPStan)更可靠

类型系统在 PHP 里始终是“声明层”和“运行层”两套逻辑并存,混淆这两者是绝大多数类型相关 bug 的根源。

text=ZqhQzanResources