php 声明类型主要通过函数参数、返回值以及变量(需配合注解或静态分析工具)来实现,而 strict_types 严格模式决定了类型检查是执行强制转换还是抛出异常。建议开启 strict_types=1,因为它能避免隐式类型转换带来的隐蔽 bug,确保数据类型的确定性。

如何在函数中声明标量类型?
在 PHP 7.0+ 中,可以在函数签名中直接为参数和返回值声明标量类型(如 int, float, string, bool)。如果未开启严格模式,PHP 会尝试将传入的值转换为声明的类型;如果开启严格模式,则必须完全匹配,否则抛出 TypeError。
<?php // 默认情况下(弱模式)
function add(int $a, int $b): int {
return $a + $b;
}
// 调用时传入字符串 "5",PHP 会自动将其转换为整数 5
$result = add("5", "3");
echo $result; // 输出 8
// 如果文件顶部有 declare(strict_types=1);
// 上述调用将抛出 TypeError: Argument 1 passed to add() must be of type int, string given
这种机制允许你在代码中明确表达函数的契约。例如,一个处理用户 ID 的函数应该声明为 int,这样任何非整数的传入都会在开发阶段立即报错,而不是静默地变成 0 或 null。

类属性与数组如何声明类型?
对于类属性和数组,PHP 提供了属性类型声明(Property Types)和数组类型提示。从 PHP 8.0 开始,可以直接在类属性后声明类型。对于数组,可以使用 array 关键字,或者在 PHP 8.1+ 中使用更具体的数组形状(Array Shapes)通过静态分析工具支持,但原生运行时主要依赖 array 或联合类型。
<?php class User {
// PHP 7.4+ 支持属性类型声明
public string $name;
public int $age;
// 方法中的数组类型
public function getTags(array $tags): array {
return array_map('trim', $tags);
}
}
$user = new User();
$user->name = "Alice"; // 正确
// $user->name = 123; // 若开启严格模式,此处可能报错取决于上下文
$u = new User();
$tags = $u->getTags([" php ", " web "]);
print_r($tags); // 输出 ['php', 'web']
这些声明帮助 IDE 提供更好的自动补全和错误检查。虽然运行时对类属性的类型检查在某些旧版本或特定配置下可能不如函数参数严格,但在现代 PHP 项目中,结合 strict_types 和静态分析工具(如 PHPStan),可以极大地提升代码质量。

strict_types=1 对现有代码的影响是什么?
开启 strict_types=1 后,任何不符合声明类型的传入值都会导致 TypeError 异常,而不是像弱模式下那样进行隐式转换。这意味着如果你的代码库中有大量依赖隐式转换的逻辑(例如将空字符串视为 0,或将布尔值 true 视为 1),开启严格模式会导致这些逻辑失效并抛出异常。
<?php declare(strict_types=1);
function processValue(int $value): string {
return "Value is: " . $value;
}
// 在严格模式下,以下调用会失败
try {
echo processValue(10); // 正常输出
echo processValue("10"); // 抛出 TypeError
} catch (TypeError $e) {
echo "Error: " . $e->getMessage();
}
因此,在大型项目中逐步迁移到严格模式需要谨慎。建议在新增代码中始终使用 strict_types=1,并对现有代码进行全面的测试覆盖,以确保没有隐藏的依赖关系被破坏。对于第三方库,通常它们内部可能未开启严格模式,因此在调用它们时需要注意类型兼容性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











