PHP83的第一个决议内置json验证

目前PHP8.2已经进入RC阶段,按计划还有一个月就会发布正式版。而PHP8.3的决议也早已开始推进了。本文为大家介绍一个最新通过的决议,也是PHP8.3的第一个决议:内置JSON验证函数。

这项决议在-08-14发起,-10-07投票完成,最终18票通过,1票反对。

本决议很简单,增加一个内置的验证JSON有效的函数:json_validate。大多数的用户通过json_decode来将json字符串解析为数组或对象,本提议的函数将和json_decode使用完全的相同的JSON解析器,以保证json_validate和json_decode的效果和行为完全一致的。

提议简介

增加一个函数,定义如下:

参数

json

需要验证的json字符串。

此函数仅适用于UTF-8编码的字符串。

depth

需要解码的最大深度

flags

的位掩码JSON_INVALID_UTF8_IGNORE。

以上参数与json_decode一致。

返回值

如果给定的字符串是有效的json,则返回true,否则返回false。

例子

1.验证一个有效的json字符串

结果将是

2.验证一个无效的json字符串

结果将是

可以使用json_last_error()和/或json_last_error_msg()获取验证期间的错误。

决议的简要

各个用户都测试了该功能,并且结果表现正常。对该功能也积极认可。

邮件工作组的大多数社区对认可该决议,也期待将其集成到PHP中。

负责代码检查的人一致认为,这是小实现,易于维护,同时这样的小实现将带来很大的好处。

社区非常积极的参与决议的讨论并提供了各种有效的反馈,并且还花时间测试了该函数。

社区的一些讨论

以下仅是众多有用的讨论中的一小部分,本文仅做意译:

1.

一些信任的数据来源的JSON往往很小,但也需要一个验证函数来处理一些不规范的JSON。

2.

使用新的函数可以更容易防御含有拒绝服务攻击内容的json,出于安全原因,这是很好的补充。

3.

快速有效的验证json通信格式,并且减少拒绝服务攻击的攻击面。为什么要集成使用json_decode做验证的缺点

json_decode会生成ZVAL(数组、对象等),这将占用内存并处理,如果仅仅是为了验证是否是有效的json字符串,不需要这样做。

使用正则表达式的缺点

使用正则表达式,将导致出现不同于json_decode的实现,并且容易出错,难以维护。

用户自行实现的缺点

编写json解析器不是一件容易的事

它们需要与json_decode的JSON解析器保持同步,否则两者表现可能不一致。

用户自己编写一个json解析器是多余的,php本来就有一个。

PHP本来就有一个JSON解析器

如前文提到的,php的json_decode本身就有一个解析器。json_validate将使用该解析器,以保证%的兼容性。

有影响力的项目和开发者

在后面会介绍到,众多有影响力的项目都将因此函数收益。

核心中增加的复杂性

目前,核心中有一个JSON解析器,由json_decode()来完成。不需要为此决议添加新的JSON解析。新的函数将使用他的解析器,但不会生成对象数组等。

为什么之前没有

集成一个可以用户自行实现的小型实现不是一个好主意。

json_validate可能仅对边缘情况适用。json_decode可以解决99%的情况。如果为了1%的情况集成,那么要不要增加xml、yaml甚至更多类型的验证函数?这可能会让PHP变得臃肿。

决议期间的变动

原本的方案中,json_validate可能会对一些情况抛出异常(json_decode完全没有这些行为)。后来经过讨论和建议,修改了实现,不再抛出异常。因为这也并不会更有意义。

建议的版本

下一个PHP8.x,(php8.3)

主要受益的开源项目

SymfonyFramework

LaravelFramework

LaravelFramework

WordpressCLI

在Stackoverflow中的讨论

在PHP中,这个问题是stackoverflow中与jsonphp相关的排名最高的问题之一,“在PHP中检查字符串是否为JSON的最快方法?”

查看k次。排名

询问如何做到这一点的人,还提供在python和java的真实用例。

结尾

这仍然是一个很小的改动,最终以18票同意,1票反对通过了决议。预计将在PHP8.3中实现。

原文标题:PHP8.3的第一个决议:内置json验证函数

原文


转载请注明:http://www.aierlanlan.com/rzdk/5253.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了