rfc:zpp-conversion-rules
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:zpp-conversion-rules [2015/02/20 04:57] – francois | rfc:zpp-conversion-rules [2021/03/27 14:25] (current) – Move to inactive ilutov | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: Type parsing modifications ====== | ====== PHP RFC: Type parsing modifications ====== | ||
- | * Version: 0.2 | + | * Version: 0.4 |
- | * Date: 2015-02-19 | + | * Date: 2015-02-22 |
* Author: François Laupretre, francois@php.net | * Author: François Laupretre, francois@php.net | ||
- | * Status: | + | * Status: |
* First Published at: https:// | * First Published at: https:// | ||
Line 9: | Line 9: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | This RFC proposes changes in the mechanism used to parse internal function arguments. | + | This RFC proposes changes in the ruleset used to filter |
- | + | and convert input arguments to internal functions. | |
- | The main change proposed here is a modification of the ruleset used to filter | + | |
- | and implicitly | + | |
- | + | ||
- | Then, minor additions to be used by the userland type hinting system are proposed. | + | |
===== History ===== | ===== History ===== | ||
Line 21: | Line 17: | ||
[[https:// | [[https:// | ||
- | While the discussion | + | While the discussion |
- | each camp showing use cases to prove it was right, we decided to explore another | + | each camp showing use cases to prove it was right, we decided to gather all these use cases |
- | way : find a single-mode compromise that would satisfy both camps. | + | and go exploring another |
It was soon clear that the strongest argument of strict-typing proponents was that | It was soon clear that the strongest argument of strict-typing proponents was that | ||
- | ' | + | ' |
- | allowing, for instance, true or '7 years' as integer value. | + | |
- | + | ||
- | As the ' | + | |
- | ZPP layer, | + | |
- | and as everyone seemed to agree it should remain so, we decide to propose a new more | + | |
- | restrictive ruleset to be implemented in ZPP and zend_parse_parameters(). | + | |
- | So, this RFC presents | + | As the ' |
+ | and as everyone agreed any single-mode mechanism should keep using it, | ||
+ | we decided to propose | ||
- | Note: In the rest of the document, ' | + | Note: In the whole document, |
- | as, whatever the final implementation, both mechanisms must remain in sync. | + | as, whatever the ruleset, these mechanisms must keep implementing the same logic. |
===== Proposal ===== | ===== Proposal ===== | ||
Line 50: | Line 42: | ||
The following table shows the current rules used to accept and convert an input zval through | The following table shows the current rules used to accept and convert an input zval through | ||
- | the ZPP layer : | + | ZPP : |
^ ^ Zval type ^^^^^^^^ | ^ ^ Zval type ^^^^^^^^ | ||
^ ZPP type ^ IS_NULL | ^ ZPP type ^ IS_NULL | ||
^ bool | Yes (-> false) | < | ^ bool | Yes (-> false) | < | ||
- | ^ long | Yes (-> 0) | Yes (-> 0) | Yes (-> 1) | < | + | ^ long | Yes (-> 0) | Yes (-> 0) | Yes (-> 1) | < |
^ double | ^ double | ||
^ string | ^ string | ||
Line 63: | Line 55: | ||
* (3) Run string through is_numeric_str_function() and detect error. If double returned, convert it to long | * (3) Run string through is_numeric_str_function() and detect error. If double returned, convert it to long | ||
* (4) Run string through is_numeric_str_function() and detect error. If int returned, convert it to double | * (4) Run string through is_numeric_str_function() and detect error. If int returned, convert it to double | ||
+ | * (5) Discard fractional part, if any | ||
The conversion of IS_STRING to int/float is done through _is_numeric_string_ex(). | The conversion of IS_STRING to int/float is done through _is_numeric_string_ex(). | ||
Among others, this function has the following behavior : | Among others, this function has the following behavior : | ||
- | * Stop conversion at first non digit character with no error (this is what authorizes '7 years' as integer). | + | * Stop conversion at first non digit character with no error (ignore every trailing char). |
==== Proposed changes ==== | ==== Proposed changes ==== | ||
- | * Disable IS_FALSE/ | + | * Disable IS_FALSE/ |
- | * IS_STRING | + | * IS_STRING |
- | * Disable IS_NULL | + | * Disable IS_NULL to be accepted for any ZPP type except |
* Disable (IS_DOUBLE -> long) if the fractional part of the input value is non null. | * Disable (IS_DOUBLE -> long) if the fractional part of the input value is non null. | ||
* When converting from IS_STRING to long, reject conversion if string contains the representation of a number with a non null fractional part. | * When converting from IS_STRING to long, reject conversion if string contains the representation of a number with a non null fractional part. | ||
+ | * Add a ' | ||
In _is_numeric_string_ex() : | In _is_numeric_string_ex() : | ||
Line 86: | Line 80: | ||
^ ^ Zval type ^^^^^^^^ | ^ ^ Zval type ^^^^^^^^ | ||
- | ^ ZPP type ^ IS_NULL ^ IS_FALSE ^ IS_TRUE | + | ^ ZPP type ^ IS_NULL |
- | ^ bool | - | < | + | ^ null | < |
- | ^ long | - | - | + | ^ bool | - |
- | ^ double | + | ^ long | - |
- | ^ string | + | ^ double |
+ | ^ string | ||
* (1) false if null, true if non null | * (1) false if null, true if non null | ||
Line 102: | Line 97: | ||
* Ignore trailing blanks | * Ignore trailing blanks | ||
* Error on any non-blank trailing char | * Error on any non-blank trailing char | ||
- | |||
- | ==== Other changes ==== | ||
- | |||
- | ==== Add a check-only mode in ZPP ==== | ||
- | |||
- | TODO | ||
- | |||
- | ==== Implement PHP 5 optional compatibility ==== | ||
- | |||
- | TODO | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
- | Every restriction of the ruleset causes | + | Every change we propose here is a BC break. |
===== Proposed PHP Version(s) ===== | ===== Proposed PHP Version(s) ===== | ||
Line 126: | Line 111: | ||
Any code converting a string to a number is potentially impacted. If this cause | Any code converting a string to a number is potentially impacted. If this cause | ||
- | an unacceptable BC break, we'll create a private copy of this function | + | an unacceptable BC break, we'll create a private copy of the function |
- | for argument parsing. As long as it is not needed, | + | (string -> int/float) and will reserve it for ZPP. As long as it is not clearly |
- | numeric conversion uses the same code. | + | we'll keep a common code for every string to number conversions in PHP. |
==== To Opcache ==== | ==== To Opcache ==== | ||
Line 139: | Line 124: | ||
==== php.ini Defaults ==== | ==== php.ini Defaults ==== | ||
- | |||
- | Name-to-define : Allows to raise newly-introduced restrictions as E_DEPRECATED | ||
- | instead of E_RECOVERABLE_ERROR. | ||
- | |||
- | Default value: Off | ||
===== Open Issues ===== | ===== Open Issues ===== | ||
- | |||
- | Coming soon... | ||
===== Unaffected PHP Functionality ===== | ===== Unaffected PHP Functionality ===== | ||
Line 153: | Line 131: | ||
===== Future Scope ===== | ===== Future Scope ===== | ||
- | The set of supported numeric strings can be extended. | + | String to numeric conversion can be improved |
- | + | ||
- | String to numeric conversion can be made smarter | + | |
===== Proposed Voting Choices ===== | ===== Proposed Voting Choices ===== |
rfc/zpp-conversion-rules.1424408224.txt.gz · Last modified: 2017/09/22 13:28 (external edit)