首页 > 生活服务 > 程序猿源

程序猿源

php严格模式

管理员 11月前 76浏览

什么是严格的类型模式?

PHP 是一种弱类型语言,这意味着变量的类型可以在运行时改变。然而,PHP 7 引入了一种新的类型系统,允许开发者指定变量和函数参数的类型。当启用了严格的类型模式时,PHP 将强制执行这些类型声明,如果代码中的类型不符合声明的类型,PHP 将抛出错误。

为什么要使用 declare(strict_types=1);

  1. 类型安全:启用严格类型模式可以提高代码的类型安全性,减少类型错误的可能性。

  2. 更好的性能:PHP 7 及之后的版本中,启用严格类型模式可以提高性能,因为类型检查更严格,可以减少类型转换的开销。

  3. 代码清晰:通过类型声明,代码的意图更加清晰,有助于其他开发者更好地理解代码。

  4. 兼容性:在 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 支持以下几种基本类型:

  1. int - 表示整数类型。

  2. float - 表示浮点数,也称为双精度类型。

  3. string - 表示字符串类型。

  4. bool - 表示布尔类型,值为 true 或 false

  5. array - 表示数组类型。可以进一步指定为 array 或 array<mixed, mixed>

  6. callable - 表示可调用的类型,如函数或闭包。

  7. iterable - 表示可以被遍历的类型,如数组或实现了 Traversable 接口的对象。

  8. object - 表示任意对象类型。

  9. mixed - 表示可以是任何类型。

此外,PHP 还支持更具体的类型声明:

  • 类名 - 指定一个类名,表示对象必须是该类或其子类的实例。

  • 接口名 - 指定一个接口名,表示对象必须实现了该接口。

  • null - 表示变量可以是 null 或指定的类型。

  • self - 表示变量必须是该类或其子类的实例。

  • parent - 表示变量必须是父类或其子类的实例。

联合类型(PHP 8.0 引入)允许一个变量可以是多种类型之一:

  • int|string - 表示变量可以是整数或字符串。

可为空类型(PHP 8.0 引入)允许一个变量可以是指定的类型或 null

  • ?int - 表示变量可以是整数或 null



版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";

评论

收藏

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

Powered By 重庆饭哥 © 2014-2022 教学资源分享站 渝ICP备20005643号-1

相信有一天,理想主义终将所向披靡.

Design by © 2021 XIFAN. Powered by 重庆饭哥

站点声明: 本站转载作品版权归原作者及来源网站所有,原创内容作品版权归作者所有,任何内容转载、商业用途等均须联系原作者并注明来源。

友情链接: 官方网站 饭哥在线工具 饭哥导航 在线运行 博客交流社区 重庆艺术工程职业学院