php变量本身不支持类型提示,仅类属性、函数参数和返回值三处生效;类属性需初始化或显式可空,strict_types=1仅影响函数调用时的参数/返回值校验,与属性声明无关。

PHP变量本身不能加类型提示,$name = 'foo' 这种写法天然不支持 string $name。所谓“变量类型提示”,只在三处真正生效:类属性、函数参数、返回值——局部变量写就报错。
类属性声明必须初始化或显式可空
PHP 7.4+ 支持 public string $name 这类语法,但有硬约束:
-
public int $id;必须在构造函数中赋值,否则读取会触发Uninitialized property警告 -
public ?string $email;允许为null,但不能赋值为0、false或空数组 - 默认值必须匹配类型:
public string $status = 'pending';合法,public string $status = null;直接报错
函数参数和返回值类型提示要配 strict_types=1 才“真严格”
declare(strict_types=1); 不影响属性声明,只控制函数调用时的参数/返回值校验:
- 没开 strict:传
"123"给function foo(int $x)会静默转成123 - 开了 strict:同上直接抛
TypeError,不妥协 - 它只对当前文件生效,include 的其他文件不受影响;第三方库没开 strict,你调它函数也不会变严格
局部变量只能靠 PHPDoc 伪提示
解释器不认,但 PHPStan、PHPStorm 依赖它做静态分析和补全:
- 必须紧挨着变量声明上一行:
/** @var string $message */$message = 'hello'; - 数组结构要写清:
/** @var array<int array string code: int> $results */</int> - 避免
@var mixed或@var object,工具基本无法推导
类型提示不是类型转换,更不等于运行时校验
声明 function process(array $data): User 只做两件事:
- 调用时检查
$data是否为数组(strict 下不自动转) - 返回时检查是否为
User实例(或子类,若未禁用协变) - 它不会把
"[1,2,3]"自动json_decode成数组,也不会在返回前帮你 new User()
最容易被忽略的是:属性类型声明是语法层强制,strict_types 是调用层校验,两者完全独立——开了 strict 不会让未初始化属性变合法,属性声明了类型也不代表函数参数自动变 strict。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











