PHP变量类型声明演进:5.6前弱类型无声明;7.0增标量类型与严格模式;7.1加可空类型和void返回;7.4支持属性类型;8.0引入联合类型和static返回类型。

一、PHP 5.6 及更早版本的变量定义特性
在 PHP 5.6 及之前版本中,变量声明不支持标量类型声明,变量默认为弱类型,赋值即创建,且数组键名自动转换行为较为宽松。这些版本对变量作用域、引用机制和超全局变量的处理方式奠定了基础规则。
1、变量无需声明即可直接赋值,例如 $name = "Alice" 立即创建并初始化变量。
2、数字字符串作为数组键时会被隐式转换为整型,如 ["01" => "a"] 中键 "01" 实际存储为整数 1。
3、函数参数无法强制指定标量类型,function foo($x) { } 允许传入任意类型值,无运行时类型校验。
立即学习“PHP免费学习笔记(深入)”;
二、PHP 7.0 引入的标量类型声明与严格模式
PHP 7.0 新增了标量类型声明(string、int、float、bool),并允许通过 declare(strict_types=1) 启用严格类型检查,显著改变了变量在函数边界处的类型约束行为。
1、启用严格模式后,函数调用时传入类型不匹配的参数将抛出 TypeError,例如声明 function add(int $a, int $b): int 时传入字符串触发错误。
2、未启用严格模式时,PHP 仍执行弱类型转换,如 add("5", "3") 会自动转为整数并返回 8。
3、返回类型声明强制函数必须返回指定类型,否则抛出 TypeError,即使使用 return null 也会失败(除非声明为可空类型,但该特性在 PHP 7.1 才引入)。
三、PHP 7.1 的可空类型与 void 返回类型
PHP 7.1 在类型系统中引入了可空类型语法(?Type)和 void 返回类型,扩展了变量在函数签名中的表达能力,使变量类型的“缺失”状态得以显式声明。
1、可空类型通过前置问号表示允许值为 null,例如 function getAge(?int $id): ?string 表示参数和返回值均可为 null。
2、void 类型仅用于函数返回声明,表示函数不返回任何值,若函数体内出现 return $value 则报错;但允许使用纯 return; 语句。
3、变量本身仍不可直接声明为可空类型,如 $x: ?int 是非法语法,类型声明仅限于函数参数和返回值上下文。
四、PHP 7.4 的属性类型声明
PHP 7.4 首次支持类属性的类型声明,使类成员变量具备编译期类型约束能力,填补了此前仅函数参数/返回值支持类型的空白。
1、类属性可声明为标量、类名、接口、array、callable 或 void(仅静态属性允许 void),例如 class User { public string $name; private ?int $age = null; }。
2、未初始化的带类型声明属性在读取时触发 Error,如访问未赋值的 $user->name 抛出 Uninitialized string property 错误。
3、属性类型声明不支持联合类型(如 int|string),该功能需 PHP 8.0 及以上版本。
五、PHP 8.0 的联合类型与静态返回类型
PHP 8.0 引入联合类型(Type1|Type2)和静态返回类型,进一步细化变量在不同上下文中的类型表达粒度,尤其增强面向对象场景下的类型安全性。
1、联合类型可用于参数、返回值及属性声明,例如 function process(string|int $input): array|false 表示输入接受字符串或整数,输出为数组或布尔 false。
2、联合类型中不允许出现 null,必须使用可空语法 ?Type 替代 null|Type。
3、static 可作为返回类型,表示返回当前静态调用类的实例,支持后期静态绑定,例如 function create(): static { return new static(); }。











