rfc:always_enable_json

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:always_enable_json [2020/04/29 23:33] tandrerfc:always_enable_json [2020/05/27 13:15] (current) tandre
Line 1: Line 1:
-====== PHP RFC: Always Enable JSON ====== +====== PHP RFC: Always available JSON extension ====== 
-  * Version: 0.1+  * Version: 0.3
   * Date: 2020-04-29   * Date: 2020-04-29
-  * Author: Tyson Andre +  * Author: Tyson Andre <tandre@php.net> 
-  * Status: Draft+  * Status: Implemented
   * Target version: PHP 8.0   * Target version: PHP 8.0
   * Implementation: https://github.com/php/php-src/pull/5495   * Implementation: https://github.com/php/php-src/pull/5495
Line 10: Line 10:
 ===== Introduction ===== ===== Introduction =====
  
-Currently, it's possible to disable the json extension with ''./configure --disable-json''+Currently, it's possible to disable the json extension with ''./configure %%--%%disable-json''
-However, JSON is extremely useful to have it's widely used in many use cases (web sites, logging output,+However, JSON is extremely useful to have because it's widely used for many use cases (web sites, logging output,
 and as a data format that can be used to share data with many applications and as a data format that can be used to share data with many applications
-and programming languages), so it would be useful for PHP maintainers and users to guarantee that it'always enabled.+and programming languages), so it would be useful for PHP maintainers and users to guarantee that ''json'' is always enabled.
  
  
 Examples of where this would be useful: Examples of where this would be useful:
  
-  * Allowing internal classes to implement `JsonSerializable`, which currently requires a hard dependency on the JSON extension. \\ (e.g. ''DateTime'' already has custom JSON serialization behavior, but is unable to implement ''JsonSerializable'' normally)+  * Allowing internal classes to implement ''JsonSerializable'', which currently requires a hard dependency on the JSON extension. \\ (e.g. ''DateTime'' already has custom JSON serialization behavior, but is unable to implement ''JsonSerializable'' because that interface doesn't always exist.)
  
   * Allowing PHP users to publish single-file scripts that use json_encode and json_decode and don't require polyfills or less readable var_export output. \\   (polyfills are less efficient and may have issues with recursive data structures)   * Allowing PHP users to publish single-file scripts that use json_encode and json_decode and don't require polyfills or less readable var_export output. \\   (polyfills are less efficient and may have issues with recursive data structures)
Line 32: Line 32:
  
 Starting in php 7.0 with the switch to jsond, it looks like licensing is no longer an issue. Starting in php 7.0 with the switch to jsond, it looks like licensing is no longer an issue.
 +
 +Extensions have been made always-on by default. For example, e.g. https://wiki.php.net/rfc/permanent_hash_ext did this for the ''hash'' extension.
  
 ===== Proposal ===== ===== Proposal =====
Line 39: Line 41:
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
  
-The ''HAVE_JSON'' C macro constant was removed from the generated ''main/php_config.h'', because it's always true (the removal of macros that are no longer useful are typically reserved for major versions such as 8.0).+Build configurations that contain ''%%--%%enable-json'' or ''%%--%%disable-json'' will have to be updatedas the argument will cease to exist.
  
-  * Libraries should check #if HAVE_JSON +Because JSON would always be built statically to guarantee it can be used, package maintainers for OSes such as Fedora would need to create stub packages for the ''php-json'' package, or to remove the package in php 8 (or mark it as provided by the core ''php'' package).
  
-Because JSON would always be built statically to guarantee it can be used, package maintainers for OSes such as Fedora would need to create stub packages for the ''php-json'' package, or to remove the package in php 8. +Some other installations already use JSON statically by default (e.g. the zips published on windows.php.net, or the default when building php from source)
- +
-Some other OSes already use JSON statically by default (e.g. the zips published on windows.php.net, or the default when building php from source)+
  
 ===== Proposed PHP Version(s) ===== ===== Proposed PHP Version(s) =====
  
 8.0 8.0
 +
 +===== RFC Impact =====
 +==== To SAPIs and Existing Extensions ====
 +
 +PECL extensions can now always rely on the ''json'' extension to be available and use its API and PHP interfaces such as ''JsonSerializable''.
 +
 +Minimal builds of PHP will slightly grow in size.
 +
 +===== Unaffected PHP Functionality =====
 +
 +Any already existing userland code will continue to work as before. Userland code may remove calls to ''extension_loaded('json')'' as they will now always return ''true''.
 +
 +The ''json'' extension does not have any external dependencies, so this will not add any more dependencies for a minimal build of PHP.
  
 ===== Future Scope ===== ===== Future Scope =====
  
-- Start using JSON in more places within PHP's own functions. For example, adding additional conversion specifiers for ''printf()'' such as ''%j'' or ''%v'' to PHP to call JSON with the default options.+  * Make internal classes that already have custom JSON serialization behavior (''ZEND_PROP_PURPOSE_JSON'' in property array getters) start implementing ''JsonSerializable'', and add implementations of jsonSerialize() returning arrays (e.g. for ''DateTime''''DateTimeZone''''DateTimeImmutable'', ''DateTimeZone''. (Changing ''ArrayObject'' wouldn't make sense, because php users rely on php serializing those with object syntax (e.g. ''{}'' instead of ''[]'')))
  
-- Add alternative options to use JSON to dump debug output in an easily machine-readable form. (e.g. ''opcache.opt_debug_level'' debug output is plaintext right now)+  * Start using JSON in more places within PHP's own functionsFor example, adding additional conversion specifiers for ''printf()'' such as ''%j'' or ''%v'' to PHP to call JSON with the default options.
  
-===== Proposed Voting Choices =====+  * Add alternative options to use JSON to dump debug output in an easily machine-readable form. (e.g. ''opcache.opt_debug_level'' debug output is plaintext right now)
  
-Make the JSON extension impossible to disable (Yes/No vote, requiring 2/3 majority)+===== Vote ===== 
 + 
 +Voting started 2020-05-13 and ends 2020-05-27. 
 + 
 +<doodle title="Make the JSON extension impossible to disable" auth="tandre" voteType="single" closed="true"> 
 +   Yes 
 +   No 
 +</doodle> 
 + 
 +===== Changelog ===== 
 + 
 +0.3: Keep the HAVE_JSON constant in config.m4, to avoid a backwards compatibility break.
  
 ===== References ===== ===== References =====
Line 66: Line 90:
  
 https://wiki.php.net/rfc/jsond https://wiki.php.net/rfc/jsond
 +
 +https://wiki.php.net/rfc/permanent_hash_ext
rfc/always_enable_json.1588203221.txt.gz · Last modified: 2020/04/29 23:33 by tandre