介绍
PHP,以其宽松的类型声明而闻名,正逐渐采纳增强代码可靠性的新特性。在PHP 7中引入的可选类型声明作为工具,有助于构建更加整洁、清晰和坚固的代码库。
开始学习类型(Getting Started with Types)
类型声明,也称为类型注释,允许开发人员在函数调用、函数返回类型和类属性中指定预期的数据类型。以下是一个简短的例子:
function add(int $a, int $b): int {
return $a + $b;
}
该功能要求两个参数均为整数,并且返回的值也是整数。
标量类型声明
标量类型在PHP 7中是一个重要的增强功能,它们允许函数要求参数的类型为int、float、string或bool。以下是使用它们的方法:
function setAge(int $age) {
echo "You are {$age} years old.";
}
严格类型检查与强制性类型检查
PHP 7 引入了严格的类型检查模式。该模式通过声明来启用。declare(strict_types=1);在文件的顶部,强制PHP遵循指定的数据类型,否则它会抛出一个TypeError异常。以下是行为上的不同之处:
// Coercive mode
function addNumbers($a, $b): int {
return $a + $b;
}
addNumbers('3', 4.2); // This will work, outputting 7
// Strict mode
declare(strict_types=1);
function addNumbersStrict($a, $b): int {
return $a + $b;
}
addNumbersStrict('3', 4.2); // TypeError
在强制模式下,PHP 将尽力匹配声明类型;而在严格模式下,则不会这样做。
联合类型
PHP 8 引入了联合类型,允许参数或返回类型接受多种类型。这在多态场景中非常有用:
function processInput(string|int $data) {
if (is_int($data)) {
echo "Integer received: $data";
} else {
echo "String received: $data";
}
}
复杂类型:数组和对象
除了基本类型之外,PHP还支持复杂的类型声明,例如数组和对象。这些可以如何使用:
function configure(array $settings) {
// Process settings array
}
class User {}
function newUser(User $user) {
// Process User object
}
可选值和默认值
可选类型,用问号前缀于类型声明,允许参数为指定类型的值或null。以下是使用可选类型的示例:
function setProfile(string $name, ?string $bio) {
if (is_null($bio)) {
echo "Welcome, $name!";
} else {
echo "Welcome, $name! Read their bio: $bio";
}
}
房产类型声明
在PHP 7.4中,引入了属性类型声明,提供了为类和对象属性声明类型的功能。示例:
class Item {
public int $id;
public string $name;
}
高级:变长参数和类型
变长参数列表也可以利用类型声明,确保传入变量长度参数列表中的所有值都是同一种类型:
function addAll(int ...$numbers): int {
return array_sum($numbers);
}
在匿名函数中使用类型。
匿名函数,也称为闭包,可以通过以下方式受益于类型声明:
$arrayOfNumbers = [1, 2, 3];
$arrayOfNumbers = array_map(
function (int $number): int {
return $number * 2;
},
$arrayOfNumbers
);
后向兼容性
新的类型声明通常具有向后兼容性,但在引入到遗留代码时应谨慎行事。在使用非正式类型的代码中可能会出现类型错误。
结论。
PHP类型声明增强了代码的健壮性和清晰度,通过引入一层强化开发者的意图并确保代码按预期工作的方式。有多种选项可供选择,从基本类型到复杂类型,这些工具为编写整洁、可预测的PHP代码提供了宝贵的资源。

