可以禁用 ext-json 吗?

Can ext-json be disabled?

可以在 PHP 中禁用 json 扩展吗? doc 表示:

As of PHP 5.2.0, the JSON extension is bundled and compiled into PHP by default.

但是评论中有人说 json 扩展有时作为单独的包提供。

可以明确禁用 json 扩展,还是我们可以确信它始终可用?


背景:我想在我的实现JsonSerializable的库中制作一个class,但如果不总是声明接口,那可能是一个BC break,并且图书馆突然依赖于一个并不总是可用的扩展。

PHP 8:

不,JSON 扩展 cannot be disabled anymore

PHP 7:

是的,可以随意安装、卸载、启用或禁用任何 PHP 扩展。

json 扩展 - 尽管它无处不在 - 仍然只是一个扩展,也可以通过这种方式删除。

在某些情况下 json 扩展名可能不存在:

  1. 管理员disabled/uninstalled它:

     ;extension=json
    
  2. 安装的PHP版本是手动从源码编译的,遗漏了json扩展名:

     --disable-json
    
  3. 扩展被捆绑为一个单独的包;例如,在 Fedora 上,您必须显式安装 php-json 软件包。

您问题的重要部分:我们能否确信它始终可用

通常情况下,我会拒绝。尽管这种特定扩展被禁用或遗漏的情况不太可能发生,但这并不意味着它不会发生。

如果您的目标受众仅限于可能不会触及这些设置的人,那么您可能是安全的,但不能保证。

我的建议:将您的库构建为 Composer 包,并将 ext-json 声明为依赖项。这样,您可以以 Composer 包的形式提供安装说明,如果底层系统不满足您的包要求,安装将失败,用户将收到缺少扩展的警告。