PHP 7.0+标量类型声明需配合declare(strict_types=1)启用严格模式,否则默认弱模式会隐式转换;严格模式下int/float/string/bool参数与返回值必须精确匹配,否则抛出TypeError。

PHP返回值类型声明必须加问号才能返回null吗
不是必须,但如果你的函数可能返回 null,而声明了非联合类型的返回值(比如 string),PHP 会直接报 TypeError。只有显式写成 ?string,才允许返回 null 或 string。
常见错误现象:Fatal error: Uncaught TypeError: Function returns string, null returned
- 声明
string→ 只能返回字符串,null、false、空数组都会触发致命错误 - 声明
?string→ 允许返回string或null,但不能返回int或array - 声明
string|null(PHP 8.0+)和?string等价,推荐用后者,更简洁
void 和 never 类型在实际项目里怎么选
void 表示“不返回任何值”,即函数只能用 return; 或自然结束;never 表示“永远不返回”,典型场景是抛异常、死循环或 exit()。
使用场景:
立即学习“PHP免费学习笔记(深入)”;
- 写 API 响应函数时,用
void提示调用方“别指望有返回值”,比如function renderJson(array $data): void { echo json_encode($data); exit; } - 封装统一错误退出逻辑,用
never更准确:function abort(int $code, string $msg): never { http_response_code($code); die($msg); } - 误用
void写了return 123;→ PHP 报TypeError;误用never却正常 return → 同样报错,因为根本没机会执行到返回语句
标量类型声明(int/float/bool)有哪些隐式转换陷阱
PHP 7.0+ 开启严格模式(declare(strict_types=1);)后,标量返回类型不再自动转换,这点和参数类型声明行为一致。
容易踩的坑:
- 写
function getId(): int { return '123'; }→ 严格模式下报错,即使字符串内容是纯数字 -
return 123.0;声明为int→ 不行,float不会自动转int - 布尔值尤其危险:
return isset($arr['id']);返回bool,但声明为int就会崩,得显式写成(int) isset(...) - 没加
declare(strict_types=1);?那返回'456'给int声明也能过——但这不是你想要的健壮性
返回数组时用 array 还是具体结构(如 array)
array 是最宽泛的声明,PHP 运行时只校验是否为数组,不检查键名或值类型;PHP 8.1+ 支持泛型式写法(如 array<string int></string>),但注意:这只是静态分析提示(PHPStan/psalm 识别),**PHP 解释器本身不校验**。
实操建议:
- 对外暴露的公共方法,优先用
array+ PHPDoc 注释说明结构,兼顾兼容性和可读性 - 内部高一致性要求模块(如 DTO 构造器),可用
list<int></int>、array<int string></int>配合静态分析工具,提前发现错用 - 别写
array[]或Array——大小写敏感且非标准,PHP 只认array - 需要强约束?考虑返回对象(如
class UserCollection implements IteratorAggregate),比数组类型安全得多
最常被忽略的是严格模式声明的位置:它只对当前文件生效,且必须放在文件顶部首行(除空白和注释外),漏掉或放错位置,类型声明就形同虚设。



















