什么是严格的类型模式?
为什么要使用 declare(strict_types=1);
?
类型安全:启用严格类型模式可以提高代码的类型安全性,减少类型错误的可能性。
更好的性能:PHP 7 及之后的版本中,启用严格类型模式可以提高性能,因为类型检查更严格,可以减少类型转换的开销。
代码清晰:通过类型声明,代码的意图更加清晰,有助于其他开发者更好地理解代码。
兼容性:在 PHP 7.1 及之后的版本中,
declare(strict_types=1);
已经是默认设置。在 PHP 8.0 中,这个声明不再是必需的,因为严格类型模式已经是默认行为。
常见的一些错误
类型不匹配的函数参数:
function addNumbers(int $a, int $b): int { return $a + $b; } // 错误使用 addNumbers(5, '10'); // 引发 TypeError,因为第二个参数是字符串而不是整数
类型不匹配的函数返回值:
function multiply(int $a, int $b): int { return $a * $b; // 正确 return "Result"; // 错误,返回值是字符串而不是整数 }
变量声明不一致:
int $x = 5;$x = "string"; // 引发 TypeError,因为 $x 被重新赋值为字符串
类型推断失败:
$y = 10;$y += "20"; // 引发 TypeError,因为 $y 被赋予了一个数字和一个字符串,类型不明确
类型声明缺失:
function process($data) {//这里期望 $data 是一个整数,但没有类型声明 }
混合类型操作:
$sum = 5 + "10"; // 在严格模式下,这将引发 TypeError,因为不能将整数和字符串相加
数组类型不匹配:
function processArray(array $arr): void { // 假设我们期望数组中的元素都是整数 foreach ($arr as $value) { // ... }}// 错误使用processArray([1, 'two', 3]); // 引发 TypeError,因为数组中包含一个字符串
对象类型错误:
class Animal {}class Dog extends Animal {}function processDog(Dog $dog): void { // ...}// 错误使用$animal = new Animal();processDog($animal); // 引发 TypeError,因为 Animal 不是 Dog
资源类型错误:
function processResource(resource $resource): void { // ...}// 错误使用$file = fopen('example.txt', 'r');processResource($file); // 假设函数期望的是数据库连接资源,而不是文件资源
错误使用null
:
复制int $z = null; // 错误,在严格模式下不能将 null 赋值给整数类型的变量
PHP 支持以下几种基本类型:
int - 表示整数类型。
float - 表示浮点数,也称为双精度类型。
string - 表示字符串类型。
bool - 表示布尔类型,值为
true
或false
。array - 表示数组类型。可以进一步指定为
array
或array<mixed, mixed>
。callable - 表示可调用的类型,如函数或闭包。
iterable - 表示可以被遍历的类型,如数组或实现了
Traversable
接口的对象。object - 表示任意对象类型。
mixed - 表示可以是任何类型。
类名 - 指定一个类名,表示对象必须是该类或其子类的实例。
接口名 - 指定一个接口名,表示对象必须实现了该接口。
null - 表示变量可以是
null
或指定的类型。self - 表示变量必须是该类或其子类的实例。
parent - 表示变量必须是父类或其子类的实例。
int|string
- 表示变量可以是整数或字符串。
?int
- 表示变量可以是整数或null
。
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";