PHP 8.4 11 月发布,你和你的团队对此毫无疑问 一直在努力理解新功能、弃用和 伴随该语言最新版本的变化。这 包括对非 POST HTTP 动词的更改。
在这个博客中,我步行 通过PHP中HTTP动词的背景,解释为什么HTTP PHP 8.4 中的动词变化很重要。然后我为开发人员提供指南 在代码中实现这些更改时参考。
PHP 开发时考虑到了网络并支持其表单处理 最早的日子。最初在 HTTP 中,本质上只有两个 浏览器可以请求网页的方法:通过 GET 或 POST。 虽然 HTML 表单仍然只真正支持这两种方法, JavaScript 能够使用任何 HTTP 方法发送 HTTP 请求, 许多工具包(例如 HTMX)甚至可以为开发人员无缝处理此问题。
GET 请求通过 URL 的查询字符串传递表单数据。 这意味着表单结果可以被添加书签、重复,甚至 缓存。因此,GET 请求通常仅用于操作 请求状态而不改变状态:搜索、结果 排序、结果过滤、分页等
如果你想执行 可能会在应用程序中进行更改的操作 - 例如, 处理购物车、发送支持消息、上传 图像等 — 您将使用 POST HTTP 方法。 POST 请求是 被认为是非幂等的,这意味着它们不能被缓存并且不应该 需要重复,因为它们有副作用。这些影响可能意味着数据库中的插入、更改或删除、文件系统操作、Web 请求或其他操作。
在 为了自动处理表单数据,PHP 提供了几种 它从传入请求填充的超全局变量。 $_GET 填充有 URL 查询字符串参数,并且可以从任何请求方法填充。然而,$_POST 仅由使用内容类型 application/x-www-form-urlencoded 发出的 POST 请求的正文填充,其可能如下所示:
title=HTTP Verbs Changes in PHP 8.4&url=https://example.org/blog/php-8.4-http-verbs&author=Just Some Guy&tags[0]=php&tags[1]=http
PHP 将接受它并填充 $_POST 超全局变量,使其变为以下内容:
<?php $_POST = [ 'title' => 'HTTP Verbs Changes in PHP 8.4', 'url' => 'https://example.org/blog/php-8.4-http-verbs', 'author' => 'Just Some Guy', 'tags' => ['php', 'http'], ];
PHP 确实这样做的事实这对您来说是幕后的一部分,这也是 PHP 如此易于学习和入门的原因之一。
此外,它还可以处理内容类型multipart/form-data,它允许浏览器除了提供表单数据之外还可以上传文件。当它这样做时,它将填充一个额外的 $_FILES superglobal,提供上传文件的信息; 然后,开发人员可以在存储之前验证和预处理这些文件 它们位于永久位置。
还有 比 GET 和 POST 多得多的 HTTP 方法以及 Web 开发人员 通常会想要选择不同的方法来提供上下文 他们正在尝试执行以下操作:
虽然浏览器本身不支持这些(还!),但许多 JavaScript 框架和库都支持。
但是 有一个问题:PHP 不会自动处理这些请求。在 事实上,你必须完全自己处理这些解析,这 当您还开始处理文件上传时,可能会出现很大的问题 以及表单数据。 (永远不要推出自己的解析器!)
PHP 8.4 引入了方法 request_parse_body():
title=HTTP Verbs Changes in PHP 8.4&url=https://example.org/blog/php-8.4-http-verbs&author=Just Some Guy&tags[0]=php&tags[1]=http
函数以一如既往的方式解析传入的请求
用于 POST 请求,但允许您指定备用变量
存储表单数据和文件上传(或覆盖超全局变量,
如果你愿意的话)。您还可以通过 $options 参数更改解析器的行为,更多信息如下。
常见模式可能是:
<?php $_POST = [ 'title' => 'HTTP Verbs Changes in PHP 8.4', 'url' => 'https://example.org/blog/php-8.4-http-verbs', 'author' => 'Just Some Guy', 'tags' => ['php', 'http'], ];
(尽管如果您正在使用框架,希望框架能够为您处理该细节。)
那就是 从字面上看,是该功能的全部。提供一个简单的功能 作为 PHP 开发人员,您已经熟悉了交钥匙行为。它 没有比这更好的了!
现在 我们已经讨论了 PHP 8.4 中 HTTP 动词的变化,让我们 查看一些示例,了解如何使用和应用这些 代码中的更新。
就像 POST 请求一样,request_parse_body() 只会解析具有以下内容的请求类型:
在 application/x-www- 的情况下形式 urlencoded,$_FILES 等效 数组(返回数组中的索引 1)将为空。如果内容 不支持类型,该函数将抛出 InvalidArgumentException。
PHP 允许您通过 php://input 流检查原始请求内容。这是一个缓冲流,可以(从 PHP 7.4 开始)多次读取。但是,当接收 multipart/form-data 时 内容,PHP 变得有点破坏性,有一个很好的理由:缓冲 文件可能会导致文件内容被写入磁盘两次, 导致更多的内存、存储和 I/O 使用。
因此,request_parse_body() 不得调用两次,因为它会破坏性地消耗 php://input。
request_parse_body() 的 $options 参数允许您在运行时更改其行为,而不是依赖于硬编码php.ini 配置。
以上是PHP 8.4 中的 HTTP 动词变化的详细内容。更多信息请关注PHP中文网其他相关文章!