php函数参数类型声明必须写在参数名前,如function foo(type $param);strict_types=1须为文件首行非空非注释语句;可空类型用?string而非string|null;void仅作返回类型且禁止return值;联合类型中null须用?语法。

PHP 函数参数类型声明必须写在参数名前面
PHP 7.0+ 支持在函数定义中直接声明参数类型,语法是 function foo(Type $param),不是 function foo($param: Type)(那是 TypeScript 风格,PHP 不认)。漏掉类型或位置写错,会直接报 ParseError。
- 标量类型(
string、int、float、bool)默认开启严格模式才强制校验;否则 PHP 会尝试自动转换(比如把"123"转成int) - 类名、接口名、
array、callable、iterable、object这些类型,无论是否启用严格模式,只要传错就立刻抛TypeError - 如果想允许
null,得显式写成?string或string|null(PHP 8.0+ 推荐前者),光写string就不接受null
strict_types=1 必须放在文件顶部第一行
启用严格类型检查不是靠函数里写类型就能生效的——它依赖 declare(strict_types=1);,而且这行必须是 PHP 文件中**第一个非空白、非注释的语句**。放第二行、被 BOM 或空格顶到前面,都会让声明失效,变成松散类型行为。
- 这个声明只对当前文件有效,不会影响
include或require的其他文件 - 没加这行时,
int $x = "42"会静默转成42;加了之后,直接报TypeError - 常见坑:用 IDE 自动生成文件头(比如版权注释)时,不小心把
declare挤到了第二行,结果调试半天发现类型没生效
void 返回类型不能有 return 值,但可以 return;
void 表示函数不返回任何值,连 null 都不算合法返回。写成 function foo(): void { return null; } 会触发 Fatal error。
- 正确写法只有两种:
return;(显式退出)或直接结束函数体(隐式返回) -
void不能作为参数类型,也不能出现在联合类型里(比如void|string是语法错误) - 注意和没有声明返回类型的函数区别:没声明时,函数可以返回任意值;声明了
void,就彻底禁止返回任何表达式
联合类型(PHP 8.0+)里 null 要用 ? 写法,别混用 | null
PHP 8.0 引入联合类型,比如 string|int,但 null 是个特例:必须用可空语法 ?string,不能写成 string|null(虽然解析器能认,但会触发 Deprecated 警告,PHP 9 会彻底禁用)。
立即学习“PHP免费学习笔记(深入)”;
-
?string等价于string|null,但前者是官方推荐写法,且更清晰表达“可空”语义 - 联合类型中不能出现
void、mixed(PHP 8.0 中mixed是保留字,不能用于联合类型) - 如果函数可能返回多个类型又含
null,比如字符串或整数或空,得写成string|int|null?不对——要写成?string|int?也不对。正确是string|int加上函数内允许返回null的逻辑,再配合?string|int不合法;实际应选string|int|NULL并确保启用了strict_types=1,但更稳妥是改用mixed或封装为返回数组
declare(strict_types=1) 的位置、可空语法的写法、以及联合类型中 null 的处理方式上。这几个点不手动验证一遍,很容易以为“写了类型就生效了”。











