rfc:typed_properties_v2
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:typed_properties_v2 [2019/01/03 14:05] – automatic promotion of arrays and objects nikic | rfc:typed_properties_v2 [2019/01/11 16:16] (current) – Implemented nikic | ||
---|---|---|---|
Line 6: | Line 6: | ||
* Implementation: | * Implementation: | ||
* Discussion: https:// | * Discussion: https:// | ||
- | * Status: | + | * Status: |
===== Introduction ===== | ===== Introduction ===== | ||
Line 1253: | Line 1253: | ||
===== Errata ===== | ===== Errata ===== | ||
- | During final implementation work after the RFC was accepted, a number of cases were encountered which weren' | + | During final implementation work after the RFC was accepted, a number of cases were encountered which weren' |
==== Automatic promotion of arrays and objects ==== | ==== Automatic promotion of arrays and objects ==== | ||
- | PHP automatically initializes falsy values that are used as arrays or object | + | PHP automatically initializes falsy values that are used as arrays or objects |
<code php> | <code php> | ||
Line 1272: | Line 1272: | ||
$prop-> | $prop-> | ||
</ | </ | ||
+ | |||
+ | ==== Strictness of runtime-evaluated default values ==== | ||
+ | |||
+ | Default values for both parameters and properties always follow the strict typing semantics, independently of the strict typing mode that applies in a particular file. However, there is one exception to this rule: If a constant expression parameter default value cannot be evaluated during compilation, | ||
+ | |||
+ | <code php> | ||
+ | function foo(int $x = FOO) { // currently allowed | ||
+ | var_dump($x); | ||
+ | } | ||
+ | define(' | ||
+ | foo(); | ||
+ | </ | ||
+ | |||
+ | For typed properties we do not make such an exception and following code will generate a TypeError: | ||
+ | |||
+ | <code php> | ||
+ | class Test { | ||
+ | public int $x = FOO; // TypeError | ||
+ | } | ||
+ | define(' | ||
+ | var_dump(new Test); | ||
+ | </ | ||
+ | |||
+ | The reason for this choice is that evaluation of constant expressions at compile-time vs run-time is an optimization choice and should not result in behavioral differences. Whether a constant expression is evaluated during compilation depends on many factors, including code order and whether or not opcache is enabled. We believe that the current behavior of parameters is a bug, not an intentional choice. | ||
+ | |||
+ | ==== Incrementing/ | ||
+ | |||
+ | When a value is incremented beyond '' | ||
+ | |||
+ | As stated, this would result in the following peculiar behavior: Incrementing an '' | ||
+ | |||
+ | As such, we would always generate an error on increment/ | ||
+ | |||
+ | To avoid this, we instead define that incrementing/ | ||
===== Changelog ===== | ===== Changelog ===== | ||
Line 1277: | Line 1311: | ||
Significant changes to the RFC are noted here. | Significant changes to the RFC are noted here. | ||
- | * 2018-01-03: Add errata: Automatic promotion of arrays and objects. | + | * 2019-01-07: Add errata: Increment/ |
+ | * 2019-01-03: Add errata: Strictness of runtime-evaluated default values. | ||
+ | * 2019-01-03: Add errata: Automatic promotion of arrays and objects. | ||
* 2018-07-16: Add note about compatibility requirement on properties coming from traits. | * 2018-07-16: Add note about compatibility requirement on properties coming from traits. | ||
* 2018-07-10: Add shim header to make porting extension easy. | * 2018-07-10: Add shim header to make porting extension easy. |
rfc/typed_properties_v2.txt · Last modified: 2019/01/11 16:16 by nikic