rfc:scalar_type_hinting_with_cast

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
rfc:scalar_type_hinting_with_cast [2014/07/24 14:25]
ajf Fixed "Conversion is allowed only if data-loss does not happen." bit
rfc:scalar_type_hinting_with_cast [2021/09/09 06:07] (current)
heiglandreas Fixed a typo in the First Published at URL
Line 1: Line 1:
 ====== Request for Comments: Scalar Type Hinting With Casts ====== ====== Request for Comments: Scalar Type Hinting With Casts ======
-  * Version: 0.1.8 +  * Version: 0.1.9.1 
-  * Date: 2012-07-03 (reopened 2014-07-13, latest update 2014-07-20)+  * Date: 2012-07-03 (reopened 2014-07-13, latest update 2014-09-14, withdrawn 2014-09-15)
   * Author: Anthony Ferrara <ircmaxell@php.net> (original)   * Author: Anthony Ferrara <ircmaxell@php.net> (original)
   * Contributors: Andrea Faulds <ajf@ajf.me> (current maintainer)   * Contributors: Andrea Faulds <ajf@ajf.me> (current maintainer)
-  * Status: Under Discussion (previously Withdrawn) +  * Status: Withdrawn (previously Withdrawn then reopened
-  * First Published at: http://wiki.php.net/rfc/scalar_type_hinting_with_casts+  * First Published at: http://wiki.php.net/rfc/scalar_type_hinting_with_cast
  
 ===== Introduction ===== ===== Introduction =====
Line 15: Line 15:
 This RFC discusses a method of adding scalar type hints to PHP while attempting to embrace the dynamic nature of PHP variables.  This means that passing a type that does not exactly match the hinted type will cause a cast to happen. This cast will only succeed if the argument can be cleanly converted to the requested type. If it cannot be converted without significant data-loss, an //E_RECOVERABLE_ERROR// will be raised. This RFC discusses a method of adding scalar type hints to PHP while attempting to embrace the dynamic nature of PHP variables.  This means that passing a type that does not exactly match the hinted type will cause a cast to happen. This cast will only succeed if the argument can be cleanly converted to the requested type. If it cannot be converted without significant data-loss, an //E_RECOVERABLE_ERROR// will be raised.
  
-For consistency, this patch attempts to largely follow //zend_parse_parameters()// for the validation rules, but disallows lossy conversion from float to int (1.5 -> int generates an error) and non-well-formed numeric values for float or int ('123abc' is an error). Since v0.1.6, booleans are handled strictly, also a departure from zpp.+For consistency, this patch attempts to largely follow //zend_parse_parameters()// for the validation rules, but disallows lossy conversion from float to int (1.5 -> int generates an error) and non-well-formed numeric values for float or int ('123abc' is an error). Since v0.1.6, booleans are handled strictly, and since v0.1.9, booleans are not accepted for int, float, numeric and string, also departures from zpp
  
 === Rationale for this proposal compared to others === === Rationale for this proposal compared to others ===
Line 41: Line 41:
   * //int// - Matching integers only   * //int// - Matching integers only
   * //float// - Matching floating point numbers   * //float// - Matching floating point numbers
-  * //numeric// - Mathing integers and floating point numbers (to allow polymorphic functions dealing with numbers)+  * //numeric// - Matching integers and floating point numbers (to allow polymorphic functions dealing with numbers)
   * //bool// - Matching boolean parameters only   * //bool// - Matching boolean parameters only
   * //string// - Matching strings only   * //string// - Matching strings only
Line 54: Line 54:
  
 ^ value                   ^ string ^ float  ^ int    ^ numeric ^ boolean‡^ array ^ ^ value                   ^ string ^ float  ^ int    ^ numeric ^ boolean‡^ array ^
-^ true (boolean)          | pass   | pass   | pass   | pass    | pass    | fail  | +^ true (boolean)          | fail   | fail   | fail   | fail    | pass    | fail  | 
-^ false (boolean)         pass   | pass   | pass   | pass    | pass    | fail  |+^ false (boolean)         fail   | fail   | fail   | fail    | pass    | fail  | 
 +^ NULL (NULL)             | fail   | fail   | fail   | fail    | fail    | fail  |
 ^ 0 (integer)             | pass   | pass   | pass   | pass    | fail    | fail  | ^ 0 (integer)             | pass   | pass   | pass   | pass    | fail    | fail  |
 ^ 1 (integer)             | pass   | pass   | pass   | pass    | fail    | fail  | ^ 1 (integer)             | pass   | pass   | pass   | pass    | fail    | fail  |
Line 72: Line 73:
 ^ array () (array)        | fail   | fail   | fail   | fail    | fail    | pass  | ^ array () (array)        | fail   | fail   | fail   | fail    | fail    | pass  |
 ^ array (0 => 12) (array) | fail   | fail   | fail   | fail    | fail    | pass  | ^ array (0 => 12) (array) | fail   | fail   | fail   | fail    | fail    | pass  |
-^ NULL (NULL)             | fail   | fail   | fail   | fail    | fail    | fail  | 
 ^ %%''%% (string)         | pass   | fail   | fail   | fail    | fail    | fail  | ^ %%''%% (string)         | pass   | fail   | fail   | fail    | fail    | fail  |
 ^ 1 (resource)            | fail   | fail   | fail   | fail    | fail    | fail  | ^ 1 (resource)            | fail   | fail   | fail   | fail    | fail    | fail  |
Line 125: Line 125:
 ==== Patch ==== ==== Patch ====
  
-The modifications necessary to implement this feature exist on the [[https://github.com/TazeTSchnitzel/php-src/tree/scalar_type_hints|scalar_type_hints branch of Andrea's GitHub fork]] (forked from the [[https://github.com/ircmaxell/php-src/tree/scalar_type_hints|branch on ircmaxell's GitHub fork]]). It is still a work-in-progress, and should be considered unstable at this time.+The modifications necessary to implement this feature exist on the [[https://github.com/TazeTSchnitzel/php-src/tree/scalar_type_hints|scalar_type_hints branch of Andrea's GitHub fork]] (forked from the [[https://github.com/ircmaxell/php-src/tree/scalar_type_hints|branch on ircmaxell's GitHub fork]]). It is stable to the best of Andrea's knowledgewith its tests passing and it breaking no known tests on her machine nor Travis.
  
 ===== Possible Changes ===== ===== Possible Changes =====
 +
 +For points I'm unsure on, this section lists possible future changes to the RFC.
  
 ==== Float to Int Casting Rules ==== ==== Float to Int Casting Rules ====
Line 178: Line 180:
 foo("1a"); // E_RECOVERABLE_ERROR foo("1a"); // E_RECOVERABLE_ERROR
 foo("a"); // E_RECOVERABLE_ERROR foo("a"); // E_RECOVERABLE_ERROR
 +foo(""); // E_RECOVERABLE_ERROR
 foo(999999999999999999999999999999999999); // E_RECOVERABLE_ERROR (since it's not exactly representable by an int) foo(999999999999999999999999999999999999); // E_RECOVERABLE_ERROR (since it's not exactly representable by an int)
 +foo('999999999999999999999999999999999999'); // E_RECOVERABLE_ERROR (since it's not exactly representable by an int)
 foo(1.5); // E_RECOVERABLE_ERROR foo(1.5); // E_RECOVERABLE_ERROR
 foo(array()); // E_RECOVERABLE_ERROR foo(array()); // E_RECOVERABLE_ERROR
Line 197: Line 201:
 foo("1a"); // E_RECOVERABLE_ERROR foo("1a"); // E_RECOVERABLE_ERROR
 foo("a"); // E_RECOVERABLE_ERROR foo("a"); // E_RECOVERABLE_ERROR
 +foo(""); // E_RECOVERABLE_ERROR
 foo(1.5); // float(1.5) foo(1.5); // float(1.5)
 foo(array()); // E_RECOVERABLE_ERROR foo(array()); // E_RECOVERABLE_ERROR
Line 215: Line 220:
 foo("1a"); // E_RECOVERABLE_ERROR foo("1a"); // E_RECOVERABLE_ERROR
 foo("a"); // E_RECOVERABLE_ERROR foo("a"); // E_RECOVERABLE_ERROR
 +foo(""); // E_RECOVERABLE_ERROR
 foo(1.5); // float(1.5) foo(1.5); // float(1.5)
 foo(array()); // E_RECOVERABLE_ERROR foo(array()); // E_RECOVERABLE_ERROR
Line 233: Line 239:
 foo("1a"); // string "1a" foo("1a"); // string "1a"
 foo("a"); // string "a" foo("a"); // string "a"
 +foo(""); // string ""
 foo(1.5); // string "1.5" foo(1.5); // string "1.5"
 foo(array()); // E_RECOVERABLE_ERROR foo(array()); // E_RECOVERABLE_ERROR
Line 253: Line 260:
 foo("1a"); // E_RECOVERABLE_ERROR foo("1a"); // E_RECOVERABLE_ERROR
 foo("a"); // E_RECOVERABLE_ERROR foo("a"); // E_RECOVERABLE_ERROR
 +foo(""); // E_RECOVERABLE_ERROR
 foo(1.5); // E_RECOVERABLE_ERROR foo(1.5); // E_RECOVERABLE_ERROR
 foo(array()); // E_RECOVERABLE_ERROR foo(array()); // E_RECOVERABLE_ERROR
Line 261: Line 269:
 ?> ?>
 </file> </file>
 +
 +===== Proposed Voting Choices =====
 +
 +As this is a language change, a 2/3 majority is required. Voting started 2014-09-14 and ends 2014-09-21.
 +
 +It will be a straight Yes/No vote.
  
 ===== More Information ===== ===== More Information =====
Line 282: Line 296:
   * 0.1.7 - Types are now not nullable by default   * 0.1.7 - Types are now not nullable by default
   * 0.1.8 - Added numeric typehint   * 0.1.8 - Added numeric typehint
 +  * 0.1.8.1 - Overflow prevention for int hints
 +  * 0.1.9 - Booleans not accepted for int, float, numeric or string
 +  * 0.1.9.1 - Added "" to tests, patch is stable
rfc/scalar_type_hinting_with_cast.1406211950.txt.gz · Last modified: 2017/09/22 13:28 (external edit)