搜索
首页后端开发php教程掌握 PHP:类型提示技术

Mastering PHP: Type Hinting techniques
摄影:??? ???在 Unsplash

类型提示被一些人认为是功能的圣杯。所有编程语言都必须具备的一种。 PHP 很长一段时间都没有这样的系统,但现在已被大多数开发人员广泛采用。

也就是说,PHP 的类型系统不如其他语言。许多实现了所谓的泛型。这是在结构和集合之间强制执行类型的能力。例如,在 Java 中,我们可以指定数组只能包含某种类型的项目,例如字符串数组。

也许有一天我们也会在 PHP 中拥有此功能,但在那之前我们实际上可以通过一些不同的技术来解决这个问题。由于缺乏更好的描述,我将它们称为 软类型提示运行时提示

类型提示

第一个也是最明显的类型提示是 PHP 7 中引入的类型提示,并且仍在添加到 PHP 中。类型提示常量仅在 PHP 8.3 中添加。

类型提示有助于传达需要作为参数传递给方法或函数的内容或该方法将返回的内容。类型提示将影响它们使用的任何类的签名,因为扩展具有已建立的类型提示的类将意味着它们不能被覆盖。

充分利用类型的类的示例是:


<?php class Foo
{
    public function bar(array $strings): \Closure
    {
       return function (string $string) use ($strings): bool {
           return in_array($string, $strings);
       };
    }
}


当然,我们的类型提示存在局限性,因为如前所述,我们不能使数组全部具有相同的类型,而必须只使用 array 。我们也不能将数字限制为只能是正数或在某个范围内。

另一种可能是闭包,因为无法在 PHP 的本机类型中描述匿名函数。相反,我们必须使用 Closure 或 callable 。通常,callable 也不允许用作类型。

幸运的是,仍然有一种方法可以使用类型提示来描述这些更复杂的场景。

软类型提示

我们的下一种类型提示是通过 PHPDocs 提供的。如果传递方法或返回错误类型,本机类型将在运行时引发异常,但 PHPDoc 类型提示对应用程序的运行时没有影响。

相反,软类型提示纯粹是在我们使用 VS Code 或 PHPStorm 等 IDE 时为我们提供帮助,它们会为我们检测这些类型。另一个用例是使用 PHPStan 和随后的 Rector 等静态分析工具。

使用软类型的最大优点是它可以让你更精确地描述任何参数、属性等的类型。例如,我们可以采用前面的类,更容易理解所使用的数组或闭包.


<?php class Foo
{
    /**
     * @param string[] $strings
     * @return \Closure(string): bool
     */
    public function bar(array $strings): \Closure
    {
       return function (string $string) use ($strings): bool {
           return in_array($string, $strings);
       };
    }
}


确保所有类型使用正确的最佳方法是安装 PHPStan。从那里您可能需要至少使用级别 5。然后可以通过持续集成步骤来检查类型提示是否正确来强制执行。

如果您想使用正确的软类型提示,实际上可以使用一个列表。更好的是,如果您不确定并想要运行快速测试,可以使用 PHPStan 工具来测试 PHPStan 中暗示的所有类型是否正确。

运行时提示

我们支持类型的下一个方法是使用运行时提示。这实际上意味着执行我们自己的代码来检查参数的类型。例如,我们可以检查数组是否只包含特定类型的对象。如果没有,那么我们抛出一个 InvalidArgumentException。


<?php /**
 * @param string[] $foo
 */
function bar(array $foo) {
    foreach ($foo as $string) {
        if (! is_string($string)) {
            throw new \InvalidArgumentException('foo contains non-string value');
        }
    }

    // rest of the code
}


顺便说一下,这种技术有时被称为防御性编程。看看代码示例,这相当麻烦。只是为了简单地检查数组是否正确而编写了很多代码。这就是为什么我们经常求助于库,在本例中是 webmozart/assert 。


composer require webmozart/assert


现在安装了这个软件包,我们可以将其缩短为简单的一行代码。


<?php use Webmozart\Assert;

/**
 * @param string[] $foo
 */
function bar(array $foo) {
    Assert::allStrings($foo);
}


这个库的一大优点是,如果您向 PHPStan 添加 Assert 扩展,这将有助于分析代码时的类型覆盖率。

结论

总之,掌握 PHP 中的类型提示对于希望编写干净、可维护且可靠的代码的开发人员来说是一项基本技能。虽然 PHP 的类型系统仍然缺乏其他语言中的一些功能,例如泛型,但有多种策略可以强制执行更严格的类型——无论是通过本机类型提示、PHPDoc 注释还是运行时检查。利用 PHPStan 等工具和 Assert 等库可以帮助您确保类型安全,即使在复杂的场景中也是如此。通过将这些技术集成到您的开发工作流程中,您将能够更好地自信而精确地处理 PHP 的动态特性。

我是 Peter Fox,一位在英国使用 Laravel 的软件开发人员。感谢您阅读我的文章,我还有更多内容可以阅读 https://articles.peterfox.me。我现在也是 GitHub 上的赞助者。如果您想鼓励我写更多这样的文章,请考虑一次性捐款。

以上是掌握 PHP:类型提示技术的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
11个最佳PHP URL缩短脚本(免费和高级)11个最佳PHP URL缩短脚本(免费和高级)Mar 03, 2025 am 10:49 AM

长URL(通常用关键字和跟踪参数都混乱)可以阻止访问者。 URL缩短脚本提供了解决方案,创建了简洁的链接,非常适合社交媒体和其他平台。 这些脚本对于单个网站很有价值

Instagram API简介Instagram API简介Mar 02, 2025 am 09:32 AM

在Facebook在2012年通过Facebook备受瞩目的收购之后,Instagram采用了两套API供第三方使用。这些是Instagram Graph API和Instagram Basic Display API。作为开发人员建立一个需要信息的应用程序

在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React构建具有Laravel后端的React应用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

宣布 2025 年 PHP 形势调查宣布 2025 年 PHP 形势调查Mar 03, 2025 pm 04:20 PM

2025年的PHP景观调查调查了当前的PHP发展趋势。 它探讨了框架用法,部署方法和挑战,旨在为开发人员和企业提供见解。 该调查预计现代PHP Versio的增长

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。