PHP 8.3 的第一个决议:内置 JSON 验证函数


目前PHP8.2已经进入RC阶段,按计划还有一个月就会发布正式版。而PHP8.3的决议也早已开始推进了。

本文为大家介绍一个最新通过的决议,也是PHP8.3的第一个决议:内置JSON验证函数。

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

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

提议

简介

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

json_validate(string $json, int $depth = 512, int $flags = 0): bool

参数

json

需要验证的 json 字符串。

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

depth

需要解码的最大深度

flags

的位掩码 JSON_INVALID_UTF8_IGNORE

以上参数与json_decode一致。

返回值

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

例子

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

var_dump(json_validate('{ "test": { "foo": "bar" } }'));

结果将是

bool(true)

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

var_dump(json_validate('{ "": "": "" } }'));

结果将是

bool(false)

可以使用 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将使用该解析器,以保证100%的兼容性。

有影响力的项目和开发者

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

核心中增加的复杂性

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

为什么之前没有

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

决议期间的变动

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

建议的版本

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

主要受益的开源项目

Symfony Framework

class JsonValidator extends ConstraintValidator

Laravel Framework

public function validateJson($attribute, $value)
{
if (is_array($value)) {
return false;
}

if (! is_scalar($value) && ! is_null($value) && ! method_exists($value, '__toString')) {
return false;
}

json_decode($value);

return json_last_error() === JSON_ERROR_NONE;
}

Laravel Framework

public static function isJson($value)
{}

Wordpress CLI

function is_json( $argument, $ignore_scalars = true ) {
if ( ! is_string( $argument ) || '' === $argument ) {
return false;
}

if ( $ignore_scalars && ! in_array( $argument[0], [ '{', '[' ], true ) ) {
return false;
}

json_decode( $argument, $assoc = true );

return json_last_error() === JSON_ERROR_NONE;
}

在Stackoverflow 中的讨论

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

查看 484k 次。排名

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

结尾

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

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

原文地址:https://phpreturn.com/index/a6358f5a2abccf.html

原文平台:PHP武器库

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。


相關推薦

2023-09-02

stant) 和枚举成员 (Enum member) 新增json_validate()函数,用于验证 JSON 添加 Random 扩展 添加mb_str_pad() 添加#[\Override]属性 新增更多 PHP Sockets 选项 增加对 cURL 7.87 及以下版本的新 cURL 选项和常量的支持 支持匿名只读类 (anonym

2024-01-20

PHP 8.3.2 现已发布,这是一个错误修复版本。具体更新内容包括: Core: 修复了错误GH-12953(加载包含超过 11k 元素的 Composer classmaps 时误报 SSA 完整性验证失败)。 修复了错误GH-12999(不支持 strnlen 时构建 zend_strnlen)

2022-09-07

PHP 8.2.0 的第一个候选版本 RC 1 现已发布,带来了各种错误修复,包括可能的崩溃修复。PHP CLI 的内置 Web 服务器也对其静态资源的处理进行了各种改进。 根据介绍,早期的 PHP 8.2 开发版本包括: 增加了对在 traits 中定义常量

2024-02-03

方式,当启用 REST 模式对 API 接口请求遇到异常时,将以 JSON 格式输出错误信息。 改进 Mini\Base\App 类的 dispatch() 方法,支持传入参数带入 Action 中。 改进 Mini\Base\App 类,增加名为 isApi 属性,用于判断当前请求是否为 REST 接口

2023-03-21

系统介绍 ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能

2023-07-11

te.com/ v1.8.3 更新内容 增加了离线图标插件并作为默认内置插件,现在在全内网环境下也可以正常使用tailchat了 增加了探索插件(com.msgbyte.discover),用户可以通过探索页面加入群组 探索插件的群组卡牌目前只允许后台手动

2023-04-21

pnpm 是一个快速、节省磁盘空间的软件包管理器。它使用一个内容可寻址的文件系统来存储磁盘上所有模块目录的所有文件。当使用 npm 或 Yarn 时,如果你有 100 个使用 lodash 的项目,你将在磁盘上有 100 份 lodash 的拷贝,而使用 pn

2023-04-12

4MLinux 是一个轻量级的 Linux 发行版,适用于 32 位和 64 位架构。它被命名为 "4MLinux",因为它有 4 个主要的操作系统组件。 维护(它可以被用作救援的 Live CD)、 多媒体(对几乎所有的多媒体格式都有内置的支持) Miniserver

2023-11-10

同步开源进展 欢迎加入 KCL 社区进行互动~   KCL 是一个 CNCF 基金会托管的基于约束的记录及函数语言并通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置

2023-03-02

源受限的边缘设备上。eKuiper 的主要目标是在边缘端提供一个流媒体软件框架(类似于 Apache Flink )。eKuiper 的规则引擎允许用户提供基于 SQL 或基于图形(类似于 Node-RED)的规则,在几分钟内创建物联网边缘分析应用。 近日,

2023-12-03

加了支持PHP FAST-CGI,模式,支持PHP和c++混合编程, 比如一个地址是旧的php代码,另一个地址是C++代码 news/list 访问是旧的php框架代码 news/show 访问是c++新的功能。 paozhu C++ Web框架 内置ORM JSON解析 1.特性🔥🔥🔥🔥🔥 ✅ 1. 自

2023-12-06

dir() 获取对象所有的属性、方法 PyCore::int() 构造一个整数 PyCore::float() 构造一个浮点数 PyCore::fn() 构造一个可调用函数 PyCore::scalar() 将 PyObject 对象转为 PHP 的标量类型,例如 PyStr 将

2023-05-07

PicList 是一个云存储管理和图片上传工具,可以进行包括云端目录查看、文件搜索、批量上传下载和删除文件,复制多种格式文件链接和文件预览等操作。 开源地址和软件官网 Github: https://github.com/Kuingsmile/PicList Gitee: https

2023-11-03

SQLite 是一个 C 语言库,实现了一个小型、快速、独立、高可靠性、全功能的 SQL 数据库引擎。SQLite 是世界上使用最多的数据库引擎。SQLite 的源代码属于公共领域,每个人都可以免费使用,用于任何目的。 SQLite 3.44.0 现已发布,