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

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种内置标量与复合类型,其中 NULL 和 resource 最容易误判
PHP官方文档列了8种类型:4个标量(bool、int、float、string)、2个复合(array、object)、1个特殊(NULL)、1个资源(resource)。注意 callable 和 iterable 是伪类型,只用于类型声明,不能用 gettype() 检测出来。
容易踩的坑:NULL 不等于空字符串、0 或 false,但 empty() 和 == 会把它们混为一谈;resource 类型(比如 fopen() 返回值)在 PHP 8.1 后已标记为废弃,且无法用 json_encode() 序列化,直接打印只显示 Resource id #n,必须用对应函数(如 get_resource_type())识别。
立即学习“PHP免费学习笔记(深入)”;
1CMS核心特点 安全稳定,轻量高效 采用精简代码架构,安装包体积不足1MB,无冗余功能,确保系统运行高效稳定。 广泛兼容性 全面支持PHP 5.2至PHP 8.4版本,适配MySQL及SQLite数据库,满足多样化部署需求。 灵活的内容管理 提供数十种专业输入字段类型,助力快速构建各类网站。 支持自定义栏目变量、文章字段及
-
bool只有true和false两个值,注意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 的 mixed 和 never 是类型声明关键词,不影响运行时变量类型
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 的根源。










