rfc:deprecate_dynamic_properties
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:deprecate_dynamic_properties [2021/08/25 09:47] – nikic | rfc:deprecate_dynamic_properties [2021/11/26 13:59] (current) – nikic | ||
---|---|---|---|
Line 2: | Line 2: | ||
* Date: 2021-08-23 | * Date: 2021-08-23 | ||
* Author: Nikita Popov < | * Author: Nikita Popov < | ||
- | * Status: | + | * Status: |
* Target Version: PHP 8.2 | * Target Version: PHP 8.2 | ||
- | * Implementation: | + | * Implementation: |
===== Introduction ===== | ===== Introduction ===== | ||
- | When writing to a property that has not been declared, PHP will silently create a dynamic property instead. In modern code, this is rarely done intentionally. This RFC proposes to deprecate and later remove the creation of dynamic properties | + | When writing to a property that has not been declared, PHP will silently create a dynamic property instead. In modern code, this is rarely done intentionally. This RFC proposes to deprecate and later remove the creation of dynamic properties, unless the class explicitly allows dynamic properties. |
<PHP> | <PHP> | ||
Line 22: | Line 22: | ||
// Oops, a typo: | // Oops, a typo: | ||
$user-> | $user-> | ||
- | // PHP < 8.1: Silently creates dynamic $user-> | + | // PHP <= 8.1: Silently creates dynamic $user-> |
- | // PHP | + | // PHP 8.2: Raises |
- | // PHP | + | // PHP 9.0: Throws Error exception. |
</ | </ | ||
" | " | ||
+ | |||
+ | ==== Motivation ==== | ||
+ | |||
+ | The motivation for this change is twofold: To prevent mistakes (due to typos or renames) in the common case, and to make intentional uses explicit. The core problem is that reading from a non-existing property issues a diagnostic that makes the issue immediately apparent, while writing to a non-existing property is entirely silent. PHP gives no indication whatsoever that the programmer has made a mistake. | ||
+ | |||
+ | A common counter-argument is that even if PHP itself does not detect the mistake, static analysis still can. While this is true to a degree, there are a number of problems: | ||
+ | |||
+ | - Static analysis in IDEs (probably the most widespread type of static analysis used in PHP) has to be conservative about diagnostics relating to dynamic properties. For example, PhpStorm treats creation of dynamic properties as only a weak warning (non-intrusive grey underline), because it cannot distinguish whether this dynamic property assignment is indeed a bug, or an intentional use. Treating dynamic property creation as a more severe error would result in false positives in cases where dynamic properties are used intentionally. The ''# | ||
+ | - Static analysis can only analyze assignments with a known object type and property name. This does not include any kind of dynamic assignments, | ||
+ | - On a more philosophical note, I believe that a programming language should be usable without external tooling. While IDE use is widespread among PHP programmers, | ||
+ | |||
+ | Finally, if classes using dynamic properties are explicitly declared, then we no longer need to reserve space for them on each object. This would reduce the size of all objects (that don't opt-in to dynamic properties) by 8 bytes. However, this is a fairly long-term benefit that will require additional technical work to realize. | ||
===== Proposal ===== | ===== Proposal ===== | ||
- | The creation of dynamic properties on classes that don' | + | The creation of dynamic properties on classes that aren' |
<PHP> | <PHP> | ||
Line 44: | Line 56: | ||
</ | </ | ||
- | Objects of type '' | + | Classes marked with '' |
<PHP> | <PHP> | ||
Line 52: | Line 64: | ||
$obj-> | $obj-> | ||
- | class myStdClass extends stdClass | + | # |
- | $obj2 = new myStdClass; | + | class Test {} |
+ | class Test2 extends Test {} | ||
// No deprecation warning | // No deprecation warning | ||
- | $obj2->bar = 1; | + | $obj = new Test; |
- | </ | + | $obj->bar = 1; |
- | '' | + | // No deprecation warning |
+ | $obj = new Test2; | ||
+ | $obj-> | ||
+ | </ | ||
It should be noted that properties accessed through '' | It should be noted that properties accessed through '' | ||
Line 94: | Line 110: | ||
</ | </ | ||
- | For classes that intentionally don't have a fixed set of properties, it's possible to either implement magic '' | + | For classes that intentionally don't have a fixed set of properties, it's possible to either implement magic '' |
- | + | ||
- | Using magic getters/ | + | |
In some cases it is desirable to associate information with objects that you do not own. Previously, it was possible to add a dynamic property for this purpose. Instead, a '' | In some cases it is desirable to associate information with objects that you do not own. Previously, it was possible to add a dynamic property for this purpose. Instead, a '' | ||
Line 136: | Line 150: | ||
==== Alternative opt-in to dynamic properties ==== | ==== Alternative opt-in to dynamic properties ==== | ||
- | This RFC offers '' | + | This RFC offers '' |
- | The reasoning behind | + | The difference between these approaches is in the end goal: '' |
- | Using an interface or attribute | + | While completely removing dynamic properties is a worthwhile end goal, we also need to acknowledge that dynamic properties have played an important historical role in PHP, and legacy codebases in particular may be making heavy use of them. While adding |
+ | |||
+ | We may still wish to remove | ||
==== Opt-out of dynamic properties instead ==== | ==== Opt-out of dynamic properties instead ==== | ||
Line 154: | Line 170: | ||
===== Vote ===== | ===== Vote ===== | ||
- | Yes/No. | + | Voting started 2021-11-12 and ended 2021-11-26. |
+ | |||
+ | <doodle title=" | ||
+ | | ||
+ | | ||
+ | </ |
rfc/deprecate_dynamic_properties.1629884864.txt.gz · Last modified: 2021/08/25 09:47 by nikic