在 php 中开启严格类型检查,必须在文件的第一行(declare(strict_types=1); 声明。这会影响当前文件中所有函数和方法的参数类型与返回值类型检查。默认情况下,php 8.x 仍采用弱类型模式,会自动尝试将值转换为预期类型;开启后,若传入类型不匹配且无法安全转换,将直接抛出 typeerror 异常。

声明位置与生效范围
declare 指令必须位于
<?php declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
// 正确调用
$result = add(1, 2);
// 错误调用:字符串 "3" 无法自动转为 int
try {
$result = add(1, "3");
} catch (TypeError $e) {
echo $e->getMessage(); // Uncaught TypeError: add(): Argument #2 ($b) must be of type int, string given
}
上述代码展示了严格类型的核心行为。当 add 函数期望两个 int 参数时,传入字符串 "3" 会触发 TypeError。这与弱类型模式下 PHP 自动将 "3" 转换为整数 3 的行为截然不同。开发者必须确保调用处传入的类型完全匹配,或通过显式类型转换处理输入数据。

类方法与命名空间隔离
严格类型不仅适用于全局函数,也适用于类中的方法。每个类的方法都遵循其所在文件的 declare 设置。如果项目结构复杂,建议在每个入口文件顶部统一声明,避免遗漏。此外,PHP 8.0+ 支持联合类型和属性提升,这些特性在严格模式下同样有效,但要求类型声明更加精确。
<?php declare(strict_types=1);
class User {
public function __construct(
private string $name,
private int $age
) {}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age 150) {
throw new InvalidArgumentException("Invalid age");
}
$this->age = $age;
}
}
$user = new User("Alice", 30);
echo $user->getAge(); // 输出 30
// 尝试设置无效年龄
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo $e->getMessage(); // Invalid age
}
此示例展示了构造函数属性提升和验证逻辑。在严格类型下,$age 必须为整数,负数虽符合类型但违反业务规则,因此需要额外校验。这种组合确保了类型安全和业务逻辑的正确性。开发者应结合类型声明与运行时验证,构建健壮的应用程序。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











