相关文章推荐
刚失恋的香蕉  ·  Jquery Mac OS ...·  1 年前    · 
逃跑的棒棒糖  ·  java list ...·  1 年前    · 
小眼睛的椅子  ·  C++ ...·  1 年前    · 
骑白马的毛豆  ·  python - How can I ...·  1 年前    · 

目前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 字符串。

此函数仅适用于 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中。
  • 负责代码检查的人一致认为,这是小实现,易于维护,同时这样的小实现将带来很大的好处。
  • 社区非常积极的参与决议的讨论并提供了各种有效的反馈,并且还花时间测试了该函数。
  • 社区的一些讨论

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

    一些信任的数据来源的JSON往往很小,但也需要一个验证函数来处理一些不规范的JSON。 使用新的函数可以更容易防御含有拒绝服务攻击内容的 json,出于安全原因,这是很好的补充。 快速有效的验证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武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

    本站新闻禁止未经授权转载,违者依法追究相关法律责任。授权请联系: oscbianji#oschina.cn

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

    本文地址: https://www.oschina.net/news/215074

    资讯来源: https://phpreturn.com/index/a6358f5a2abccf.html

    Ubuntu 23.04 / 22.10 性能对比,英特尔 12 代 CPU 性能暴跌

    Ubuntu 23.04 "Lunar Lobster" 在前两天正式发布了,虽然系统带来了不少新特性、新功能,以及一些问题修复,但不少还停留在 Ubuntu 22.10 甚至更早版本的用户还是会先观望观望,再决定是否升级。日前外媒 Phoronix 在 Ubuntu 23.04 与 22.10 两个系统上进行了一些初步的基准测试。如果还没升级,不妨先看看两个系统在多项...

    电子垃圾 Chromebook

    美国公共利益研究小组 (US PIRG) 最近发布的一份报告谈论了大量 Chromebook 正在成为“电子垃圾”的问题 (Chromebook Churn)。原因在于 Chromebook 的廉价设计和短暂寿命,导致使用者大多数情况下只是将其视作一次性产品,所以产生了成堆的电子垃圾。 Chromebook 是默认采用 ChromeOS 作为操作系统的笔记本电脑,优势是价...

    微软大幅改进 Visual Studio 语法高亮显示

    语法高亮是各种 IDE 和文本编辑器最基本的功能之一,通过使用不同的颜色和样式来帮助指导开发者阅读和理解代码,在视觉上区分源代码中的各种元素。但 Visual Studio 的语法高亮功能一直都不算优秀,甚至还比不上自家的 VS Code(如下图,左边是 VS Code)。 鉴于这个功能确实不够好用,再加上 Visual Studio 社区用户不断...

    超过半数的密码,AI 破解只需一分钟

    Home Security Heroes 是一家专注于安全研究的公司,近日他们发布了一项报告,主要研究的内容是 AI 需要花费多长时间可以破解你的密码,以此来提高大家对密码安全的认知。 此次测试,Home Security Heroes 使用了一个名为 PassGAN 的 AI 密码破解器来运行一个包含 1560 万个密码的列表。 AI 密码破解器 PassGAN 使用生成...

    Apache 孵化项目被公然抄袭,开源世界真的会变得更好吗?

    Apache StreamPark(incubating) 是一个流处理应用程序开发管理框架。初衷是让流处理更简单,旨在轻松构建和管理流处理应用程序,提供使用 Apache Flink 和 Apache Spark 等编写流处理应用程序的开发框架。同时,StreamPark 提供了一个流处理应用管理平台,核心能力包括但不限于流应用开发、调试、交互查询、部署、运维...

    逆向工程 OpenAI API,“白嫖” GPT-4 和 GPT-3.5

    近日,一个名为 GPT4Free 的项目在互联网上声名鹊起;原因在于其提供了对 GPT-4 及 GPT-3.5 免费且几乎无限制的访问。该项目通过对各种调用了 OpenAI API 网站的第三方 API 进行逆向工程,达到使任何人都可以免费访问该流行 AI 模型的目的。 具体来说,GPT4Free 并没有绕过 OpenAI 的付费墙,而是“欺骗” OpenAI API,让...

    Ruff 创始人宣布成立公司,称要改变 Python 生态

    这家公司用 Rust 开发了性能最强的 Python 代码分析工具,其创始人表示还要继续加大力度——为 Python 生态构建更多高性能开发工具。 Ruff 是去年 8 月正式开源的“明星”项目,一经面世便迅速获得了 Python 社区的关注,并被许多流行和成熟的 Python 开源项目采用,比如 Airflow, FastAPI, Pandas,还有很多科技公司也使...

    ChatGPT 生成的代码不安全

    ChatGPT 是 OpenAI 发布的大语言模型聊天机器人,可以根据用户的输入生成文本,其中包括代码。不过加拿大魁北克大学的研究人员发现,ChatGPT 生成的代码往往存在严重的安全问题,而且它不会主动告知用户存在这些问题。只有在用户提问生成的代码是否安全时才会进行回答。 研究人员在 arXiv 上发表了论文《How Secure is C...

    Flask 之父用 Rust 编写 Python 包管理工具:Rye

    Python Web 框架 Flask 作者 Armin 近日发布了新的开源项目 Rye。这是一款采用 Rust 编写的 Python 包管理工具,Armin 称其可作为 poetry/pip/pipenv/pyenv/venv/virtualenv/pdm/hatch 等同类工具的替代方案。 Armin 表示 Rye 是给自己打造的“一站式”工具,满足了他对 Python 的所有需求,包括安装和管理 Python 软件包...

    只需三分钟,让红薯在朋友圈公开赞美我

    小编在开源世界网上冲浪的时候,突然看到一个很有意思的开源软件:WechatMomentScreenshot ,这是一款可以生成朋友圈转发截图的工具。 除了可自定义朋友圈的文案和图片,这款工具还支持自定义评论者的名称、头像和评论等内容。总而言之,常规截图上能看到的内容均可自定义,排版和自己发的朋友圈完全一致。 尝试一下:h...