搜索
首页后端开发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
PHP中的依赖注入是什么?PHP中的依赖注入是什么?May 07, 2025 pm 03:09 PM

依赖性注射inphpisadesignpatternthatenhancesFlexibility,可检验性和ManiaginabilybyByByByByByExternalDependencEctenceScoupling.itallowsforloosecoupling,EasiererTestingThroughMocking,andModularDesign,andModularDesign,butquirscarecarefulscarefullsstructoringDovairing voavoidOverOver-Inje

最佳PHP性能优化技术最佳PHP性能优化技术May 07, 2025 pm 03:05 PM

PHP性能优化可以通过以下步骤实现:1)在脚本顶部使用require_once或include_once减少文件加载次数;2)使用预处理语句和批处理减少数据库查询次数;3)配置OPcache进行opcode缓存;4)启用并配置PHP-FPM优化进程管理;5)使用CDN分发静态资源;6)使用Xdebug或Blackfire进行代码性能分析;7)选择高效的数据结构如数组;8)编写模块化代码以优化执行。

PHP性能优化:使用OpCode缓存PHP性能优化:使用OpCode缓存May 07, 2025 pm 02:49 PM

opcodecachingsimplovesphperforvesphpermance bycachingCompiledCode,reducingServerLoadAndResponSetimes.1)itstorescompiledphpcodeinmemory,bypassingparsingparsingparsingandcompiling.2)useopcachebachebachebachebachebachebachebysettingparametersinphametersinphp.ini,likeememeryconmorysmorysmeryplement.33)

PHP依赖注入:增强代码可维护性PHP依赖注入:增强代码可维护性May 07, 2025 pm 02:37 PM

依赖注入在PHP中通过外部注入方式提供对象依赖,提高代码的可维护性和灵活性。其实现方式包括:1.构造函数注入,2.设值注入,3.接口注入,使用依赖注入可以解耦、提高可测试性和灵活性,但需注意可能增加复杂性和性能开销。

如何在PHP中实施依赖注入如何在PHP中实施依赖注入May 07, 2025 pm 02:33 PM

在PHP中实现依赖注入(DI)可以通过手动注入或使用DI容器来完成。1)手动注入通过构造函数传递依赖,如UserService类注入Logger。2)使用DI容器可以自动管理依赖,如Container类管理Logger和UserService。实现DI可以提高代码的灵活性和可测试性,但需要注意过度注入和服务定位器反模式等陷阱。

unset()和session_destroy()有什么区别?unset()和session_destroy()有什么区别?May 04, 2025 am 12:19 AM

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

在负载平衡的情况下,什么是粘性会话(会话亲和力)?在负载平衡的情况下,什么是粘性会话(会话亲和力)?May 04, 2025 am 12:16 AM

stickysessensureuserRequestSarerOutedTothesMeServerForsessionDataConsisterency.1)sessionIdentificeAssificationAssigeaSsignAssignSignSuserServerServerSustersusiseCookiesorUrlModifications.2)一致的ententRoutingDirectSsssssubsequeSssubsequeSubsequestrequestSameSameserver.3)loadBellankingDisteributesNebutesneNewuserEreNevuseRe.3)

PHP中有哪些不同的会话保存处理程序?PHP中有哪些不同的会话保存处理程序?May 04, 2025 am 12:14 AM

phpoffersvarioussessionsionsavehandlers:1)文件:默认,简单的ButMayBottLeneckonHigh-trafficsites.2)Memcached:高性能,Idealforsforspeed-Criticalapplications.3)REDIS:redis:similartomemememememcached,withddeddeddedpassistence.4)withddeddedpassistence.4)databases:gelifforcontrati forforcontrati,有用

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脱衣机

Video Face Swap

Video Face Swap

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

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

DVWA

DVWA

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

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器