
PHP变量本身不能加类型提示
PHP的变量是动态类型的,$var 这种写法天然不支持像函数参数那样直接写 string $var。你看到的所谓“变量类型提示”,实际只在三种地方生效:类属性声明、函数参数、返回值——而普通局部变量不行。
常见错误现象:PHP Parse error: syntax error, unexpected 'string',就是试图写 string $name = 'foo'; 导致的。
- 只有
class内部的属性能用类型声明:public string $name; - 函数参数和返回值可以:
function greet(string $name): string { ... } - 局部变量(比如
for循环里定义的$i)无法加类型,PHP会直接报错
类属性类型声明要小心默认值和构造逻辑
PHP 7.4+ 支持类属性类型声明,但默认值必须匹配类型,且不能为 null(除非显式声明为可空)。
使用场景:定义 DTO、实体类、配置对象时,靠类型约束减少运行时意外。
立即学习“PHP免费学习笔记(深入)”;
-
public int $id;→ 必须在构造或赋值前初始化,否则读取会触发Uninitialized property警告 -
public ?string $email;→ 允许null,但不能赋值为0或空数组 - 如果依赖构造函数赋值,别忘了在
__construct()里显式设置,否则属性处于未初始化状态
PHPStan/PHPStorm 等工具的「伪类型提示」怎么写
虽然 PHP 解释器不认,但静态分析工具和 IDE 能识别 PHPDoc 注释里的类型,用来补全、检查和报错。
关键点:它不影响运行,只服务开发阶段,但写错照样导致误报或漏报。
- 局部变量用
/** @var string $message */,必须紧挨着变量声明上一行 - 数组结构要写清楚:
/** @var array<int array string status: int> $results */</int> - 避免模糊写法如
@var mixed或@var object,工具基本没法推导 - PHPStorm 对
@var支持好,PHPStan 需开启phpstan.neon中的checkGenericClassInNonGenericObjectType: true才能更好识别泛型
类型声明和 strict_types=1 的关系容易混淆
declare(strict_types=1); 只影响函数调用时的参数和返回值类型检查,跟变量声明无关,但它会让类型提示更“硬”——比如传 int 给期待 float 的函数会直接报 TypeError,而不是静默转换。
性能影响几乎为零,但兼容性要注意:
- 它只对当前文件生效,不会污染其他
include文件 - 第三方库如果没开 strict,你自己的文件开了,调用它们的函数时仍按弱类型处理
- 不要在
composer autoload的入口文件盲目加,可能触发未知TypeError
真正容易被忽略的是:属性类型声明 + strict_types 并不叠加作用——前者是语法层强制,后者是调用层校验,两者独立生效。写代码时得同时盯住两边的约束边界。











