掌握 PHP:类型提示技术
摄影:??? ???在 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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
