当前位置:首页 > 科技  > 软件

使用Declare(strict_Types=1)来获得更健壮的PHP代码

来源: 责编: 时间:2024-07-12 17:25:31 591观看
导读介绍如果您是PHP开发人员,您可能在某些PHP文件的开头看到过declare(strict_types=1)语句。我第一次看到这个声明时,我不知道它是做什么的。我以为这是某种注释,或者是我之前的旧PHP语法,但我错了(大错特错!)。在这篇文章中,我

介绍

如果您是PHP开发人员,您可能在某些PHP文件的开头看到过declare(strict_types=1)语句。5j128资讯网——每日最新资讯28at.com

我第一次看到这个声明时,我不知道它是做什么的。我以为这是某种注释,或者是我之前的旧PHP语法,但我错了(大错特错!)。5j128资讯网——每日最新资讯28at.com

在这篇文章中,我们将介绍什么是declare(strict_types=1),以及它如何帮助您提高PHP代码的类型安全性。5j128资讯网——每日最新资讯28at.com

declare(strict_types=1) 是什么?

declare(strict_types=1)是一个启用PHP严格模式并在PHP应用程序中强制严格类型的语句。5j128资讯网——每日最新资讯28at.com

它是在PHP 7.0中添加的,当时类型声明系统首次在PHP中实现。这意味着它可以在PHP 8项目中使用,因此您可以开始在代码中充分利用严格类型。5j128资讯网——每日最新资讯28at.com

当你使用这个语句时,PHP会对函数的参数和返回类型进行严格的类型检查。这意味着如果一个函数需要某种类型的参数或返回值,如果使用了错误的类型,PHP将抛出错误。这也适用于具有指定类型提示和返回类型的PHP闭包和箭头函数。5j128资讯网——每日最新资讯28at.com

让我们举一个不使用declare(strict_types=1)的简单例子:5j128资讯网——每日最新资讯28at.com

function add(int $a, int $b): int{    return $a + $b;}

现在假设我们用字符串参数调用这个函数:5j128资讯网——每日最新资讯28at.com

echo add('1', '2'); // Output:// 3

PHP会很高兴地将字符串参数转换为整数并返回结果3。5j128资讯网——每日最新资讯28at.com

在某些情况下,您可能完全不介意这种行为。但它可能会产生一些您没有预料到的意外后果,并可能导致应用程序中的错误。5j128资讯网——每日最新资讯28at.com

然而,让我们假设我们想在这个例子中使用declare(strict_types=1)。我们可以通过在文件顶部添加以下语句来实现这一点:5j128资讯网——每日最新资讯28at.com

declare(strict_types=1); function add(int $a, int $b): int{    return $a + $b;}

现在,如果我们用字符串参数调用add函数,PHP将抛出一个错误:5j128资讯网——每日最新资讯28at.com

echo add('1', '2'); // Output:// Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given

正如我们在这里看到的,PHP抛出了一个错误,因为add函数期望传递整数,但却接收到了字符串。5j128资讯网——每日最新资讯28at.com

类似地,如果启用了严格的类型检查,并且我们试图从方法返回错误的数据类型,PHP也会抛出错误。例如,假设我们的add函数现在接受浮点数而不是整数,并且我们没有启用严格的类型检查:5j128资讯网——每日最新资讯28at.com

function add(float $a, float $b): int{    return $a + $b;}

我们可以这样调用函数:5j128资讯网——每日最新资讯28at.com

echo add(1.25, 2.25); // Output:// 3

你发现输出中的问题了吗?5j128资讯网——每日最新资讯28at.com

我们应该得到的答案是3.5。然而,因为我们已经将返回类型定义为int,所以我们已经将浮点数(应该返回的)转换为整数,并失去了精度。可以想象,这可能会在我们应用程序的其他部分导致一些问题,我们正在使用这个结果,并且可能需要精度。5j128资讯网——每日最新资讯28at.com

现在让我们通过使用declare(strict_types=1)来解决这个问题:5j128资讯网——每日最新资讯28at.com

declare(strict_types=1); function add(float $a, float $b): int{    return $a + $b;}

我们可以这样调用函数:5j128资讯网——每日最新资讯28at.com

echo add(1.25, 2.25); // Output:// Fatal error: Uncaught TypeError: add(): Return value must be of type int, float returned

正如我们所看到的,通过启用严格的类型检查,我们可以发现函数没有返回与返回类型声明匹配的正确数据类型。这很好,因为它可以突出显示我们代码中可能存在的错误,而我们并不知道。然后,我们可以采取必要的步骤:5j128资讯网——每日最新资讯28at.com

  • 如果返回类型不正确,请更新它们
  • 如果类型提示不正确,请更新类型提示
  • 如果数据类型不正确,则更新函数体以返回正确的数据类型
  • 修复调用函数的代码中可能向其传递错误数据类型的任何错误

我应该使用declare(strict_types=1)吗?

我个人认为,在所有的PHP文件中使用declare(strict_types=1)是一个好主意。我曾经认为仅仅有类型提示和返回类型就足以确保传递正确的数据类型,但我现在改变了主意。当我使用declare(strict_types=1)时,我对我的代码更有信心,并且由于使用它而发现了一些bug(特别是当将它添加到旧代码库时)。5j128资讯网——每日最新资讯28at.com

由于PHP是一种动态类型的语言(而不是严格类型的语言),这意味着如果你不想的话,你根本不需要指定任何返回类型或类型提示。相反,PHP将在运行时为您确定类型。然而,即使有可能这样做,我还是强烈建议不要这样做。如果你不能在代码中使用严格类型(无论出于什么原因),我仍然建议使用类型提示和返回类型作为最低限度来提高PHP代码质量。5j128资讯网——每日最新资讯28at.com

自从了解它以来,我习惯在我创建的每个新PHP文件中使用它。事实上,我更新了PhpStorm设置中的所有模板,以便它自动包含在我创建的每个文件的顶部。例如,下面是创建一个新的PHP类时使用的模板:5j128资讯网——每日最新资讯28at.com

<?phpdeclare(strict_types=1);#parse("PHP File Header.php")#if (${NAMESPACE})namespace ${NAMESPACE};#endclass ${NAME} {}

这真的很方便,因为它鼓励我继续使用declare(strict_types=1),而不需要在创建文件后进行任何手动更改(我肯定会忘记这样做!)。5j128资讯网——每日最新资讯28at.com

对于我的任何Laravel阅读器,您还可以在运行Artisan命令(如php artisan make:controller)时发布用于创建PHP文件的存根。通过发布存根,您可以编辑它们并将declare(strict_types=1)添加到顶部。这意味着您使用Artisan命令创建的文件将在已启用更严格类型安全的情况下创建。5j128资讯网——每日最新资讯28at.com

当然,如果您打算对现有文件添加更严格的类型检查,我强烈建议您首先要有一个高质量的测试套件。您的PHP代码可能允许传递不正确的数据类型而不引发任何错误。但是,通过启用严格的类型检查,您的代码将变得不那么宽容,并可能开始抛出错误。这可能会导致应用程序以用户意想不到的方式中断。5j128资讯网——每日最新资讯28at.com

您可能还会发现需要重构一些代码,使其与declare(strict_types=1)兼容。但我不认为这是件坏事。相反,我认为这是一个提高代码质量的机会。5j128资讯网——每日最新资讯28at.com

为了帮助您将declare(strict_types=1)添加到代码中,您可能需要使用PHPStan之类的工具,它可以为您收集这些类型不匹配。5j128资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100729-0.html使用Declare(strict_Types=1)来获得更健壮的PHP代码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 再谈负载均衡,你学会了什么?

下一篇: 八款华丽的 HTML5 图表应用,你学会几款?

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 2023年,我眼中的字节跳动

    2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  •  首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
Top