rfc:stricter_implicit_boolean_coercions
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:stricter_implicit_boolean_coercions [2022/05/30 17:16] – iquito | rfc:stricter_implicit_boolean_coercions [2022/06/20 16:00] (current) – Change status to declined and close voting iquito | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: Stricter implicit boolean coercions ====== | ====== PHP RFC: Stricter implicit boolean coercions ====== | ||
- | * Version: 1.8 | + | * Version: 1.9 |
* Date: 2022-05-16 | * Date: 2022-05-16 | ||
* Author: Andreas Leathley, < | * Author: Andreas Leathley, < | ||
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
Line 13: | Line 13: | ||
<PHP> | <PHP> | ||
- | function toBool(bool $a) | + | function toBool(bool $a) { var_dump($a); |
- | { | + | |
- | | + | |
- | } | + | |
toBool(' | toBool(' | ||
Line 67: | Line 64: | ||
This RFC boils down to these questions: | This RFC boils down to these questions: | ||
- | * Are you losing information when you reduce a value like -375, " | + | * Are you losing information when you reduce a value like -375, " |
- | * Would you want to know when a value like -375, " | + | * Would you want to know when a value like -375, " |
* How likely is it that such a coercion is unintended? | * How likely is it that such a coercion is unintended? | ||
* What about other boolean coercions in PHP? (handled in the [[stricter_implicit_boolean_coercions# | * What about other boolean coercions in PHP? (handled in the [[stricter_implicit_boolean_coercions# | ||
Line 92: | Line 89: | ||
Typed booleans (arguments, returns, properties) as discussed in this RFC are not the only part of PHP where implicit boolean coercions happen. They also occur in expressions like '' | Typed booleans (arguments, returns, properties) as discussed in this RFC are not the only part of PHP where implicit boolean coercions happen. They also occur in expressions like '' | ||
- | However | + | Using strict_types is an established way to change how scalar type coercions work (by prohibiting any coercions) but it does not affect implicit boolean coercions |
<PHP> | <PHP> | ||
Line 113: | Line 110: | ||
</ | </ | ||
- | Typed booleans behave differently compared to these expressions because they do not accept arrays, resources, objects and null. Further restricting typed booleans is therefore not a change which makes the language more inconsistent, | + | Typed booleans behave differently compared to boolean |
<PHP> | <PHP> | ||
Line 163: | Line 160: | ||
^ From bool | always possible (coerced to "" | ^ From bool | always possible (coerced to "" | ||
- | This RFC would further reduce the gap between strict mode and coercive mode, as even in coercive mode no information would be lost when coercing a scalar value and only values that are reasonable are accepted (otherwise a deprecation notice is emitted). All allowed coercions can be reversed to end up with the original value or almost the same (" | + | This RFC would further reduce the gap between strict mode and coercive mode, as even in coercive mode no information would be lost when coercing a scalar value and only values that are reasonable are accepted (otherwise a deprecation notice is emitted). All allowed coercions can be reversed to end up with the original value or almost the same (" |
<PHP> | <PHP> | ||
- | function toBool(bool $a) | + | function toBool(bool $a) { return $a; } |
- | { | + | function toString(string $a) { return $a; } |
- | | + | function toInt(int $a) { return $a; } |
- | } | + | function toFloat(float $a) { return $a; } |
- | + | ||
- | function toString(string $a) | + | |
- | { | + | |
- | | + | |
- | } | + | |
- | + | ||
- | function toInt(int $a) | + | |
- | { | + | |
- | | + | |
- | } | + | |
- | + | ||
- | function toFloat(float $a) | + | |
- | { | + | |
- | | + | |
- | } | + | |
- | toString(toBool('' | + | toString(toBool('' |
- | toInt(toBool(0)); | + | toInt(toBool(0)); |
- | toFloat(toBool(0.0)); | + | toFloat(toBool(0.0)); |
toString(toBool(' | toString(toBool(' | ||
- | // => ' | + | // => ' |
- | // the deprecation notice of this RFC points out the loss of information | + | // the new deprecation notice of this RFC points out the loss of information |
toInt(toBool(-33)); | toInt(toBool(-33)); | ||
- | // => -33 is converted | + | // => -33 is coerced |
- | // the deprecation notice of this RFC points out the loss of information | + | // the new deprecation notice of this RFC points out the loss of information |
toFloat(toBool(0.01)); | toFloat(toBool(0.01)); | ||
- | // => 0.01 is converted | + | // => 0.01 is coerced |
- | // the deprecation notice of this RFC points out the loss of information | + | // the new deprecation notice of this RFC points out the loss of information |
| | ||
// Existing behavior leading to TypeErrors and deprecation notices: | // Existing behavior leading to TypeErrors and deprecation notices: | ||
toFloat(' | toFloat(' | ||
toInt(' | toInt(' | ||
- | toString(['' | + | toString(['' |
- | toBool(null); | + | toBool(null); |
</ | </ | ||
- | Having as little information loss between scalar type coercions | + | Having as little information loss as possible |
===== Implementation notes ===== | ===== Implementation notes ===== | ||
Line 241: | Line 223: | ||
</ | </ | ||
- | With the many deprecation notices that appeared in PHP 8.0 and 8.1 there is some wariness if more deprecation notices are worth it. These are the arguments why the RFC author thinks it will not cause too much pain: | + | With the many deprecation notices that appeared in PHP 8.0 and 8.1 there is some wariness if new deprecation notices are worth it. These are the arguments why the RFC author thinks it will not cause too much pain: |
* Each individual case is easy to fix, the easiest (but also least useful) is to loosly compare a value to true ($value == true) instead of directly giving the value to a typed bool | * Each individual case is easy to fix, the easiest (but also least useful) is to loosly compare a value to true ($value == true) instead of directly giving the value to a typed bool | ||
Line 250: | Line 232: | ||
===== Future Scope ===== | ===== Future Scope ===== | ||
- | While this RFC only targets boolean coercions when not using strict_types, | + | While this RFC only targets boolean coercions when not using strict_types, |
- | One benefit of these well-developed coercions could be to make them available in an explicit way to PHP developers. Having functions like '' | + | One benefit of these well-developed coercions could be to make them available in an explicit way to PHP developers. Having functions like '' |
- | If this RFC is accepted I would likely | + | An example of how these functions could look like can be found on Github in [[https:// |
| | ||
===== Proposed PHP Version ===== | ===== Proposed PHP Version ===== | ||
Line 266: | Line 248: | ||
* Implicit boolean expressions (as used in if, ternary, logic operators) are not affected. | * Implicit boolean expressions (as used in if, ternary, logic operators) are not affected. | ||
* FILTER_VALIDATE_BOOLEAN in the filter extension is not affected. | * FILTER_VALIDATE_BOOLEAN in the filter extension is not affected. | ||
+ | | ||
+ | ===== Vote ===== | ||
+ | |||
+ | Voting started on 2022-06-06 and will end on 2022-06-20. | ||
+ | |||
+ | <doodle title=" | ||
+ | * Yes | ||
+ | * No | ||
+ | </ | ||
===== Patches and Tests ===== | ===== Patches and Tests ===== |
rfc/stricter_implicit_boolean_coercions.1653930963.txt.gz · Last modified: 2022/05/30 17:16 by iquito