[wp-trac] [WordPress Trac] #56033: PHP 8.2: explicitly declare all known properties
WordPress Trac
noreply at wordpress.org
Wed Jun 22 04:20:06 UTC 2022
#56033: PHP 8.2: explicitly declare all known properties
-----------------------------+---------------------
Reporter: jrf | Owner: (none)
Type: task (blessed) | Status: new
Priority: normal | Milestone: 6.1
Component: General | Version:
Severity: normal | Resolution:
Keywords: has-patch php82 | Focuses:
-----------------------------+---------------------
Description changed by jrf:
Old description:
> Dynamic (non-explicitly declared) properties are deprecated as of PHP 8.2
> and are expected to become a fatal error in PHP 9.0, though this last
> part is not 100% certain yet.
>
> RFC: https://wiki.php.net/rfc/deprecate_dynamic_properties
>
> **This ticket is intended ONLY for category 1 and 2 (see below), where
> fixing a typo or explicitly declaring the property fixes things.**
>
> == The problem
>
> === What is a dynamic property ?
>
> {{{#!php
> <?php
> class Foo {
> public $id;
>
> public function __construct( $id, $field_name ) {
> // This is fine, the $id property exists on the class.
> $this->id = $id;
>
> // This is a dynamically created property as the property
> // is not declared on the class.
> $this->field_name = $field_name;
> }
> }
> }}}
>
> Dynamic properties can both be created from inside a class, like in the
> above example, as well as from outside the class (see the below example),
> which makes these issues very tricky to find via static analysis.
>
> {{{#!php
> <?php
> $obj = new Foo();
> $obj->type = 'something';
> }}}
>
> === When is something not a dynamic property ?
>
> 1. When the property is explicitly declared on the class.
> 2. When the property is explicitly declared on the (grand)parent class.
>
> === When are dynamic properties not problematic ?
>
> 1. When the class, or one of its parents, has a magic `__set()` method
> which assigns the property to a declared property.
> {{{#!php
> <?php
> class Foo {
> private $fields = [];
>
> public function __construct($field_name ) {
> $this->field_name = $field_name; // Not problematic.
> }
>
> public function __set( $name, $value ) {
> $this->fields[ $name ] = $value;
> }
> }
> }}}
> 2. When the class, or its parent, extends the PHP native `stdClass`,
> which has highly optimized versions of the `__set()` magic method
> available.
>
> == Mitigation
>
> The solution needed depends on the specific situation and each instance
> where a deprecation is thrown needs to be individually evaluated.
>
> We can basically categorize dynamic properties into four base situations:
>
> || ||= Situation =||= Solution =||
> || 1. || Typo in property name || Fix the typo, either in the property as
> declared or where the property assignment happens ||
> || 2. || Known, named, dynamic property || Declare the property on the
> (parent) class ||
> || 3. || Known use of unknown dynamic properties || Declare the full set
> of magic methods on a class (preferred) or let the class extend
> `stdClass` (discouraged) ||
> || 4. || Unknown use of unknown dynamic properties || Use the
> `#[AllowDynamicProperties] attribute on the (parent) class and/or declare
> the full set of magic methods on a class and/or let the class extend
> `stdClass` ||
>
> Note: the `#[AllowDynamicProperties]` attribute is expected to be a
> temporary solution and it is expected that support for the attribute will
> be removed at some point in the future.
>
> == Patches
>
> **Reminder: This ticket is intended ONLY for patches which fall in
> category 1 and 2, where fixing a typo or explicitly declaring the
> property fixes things.**
>
> A full set of patches for all such ''known'' situations - based on
> running the WP test suite against PHP 8.2 - is available and PRs for each
> will be opened on GitHub with a link to this ticket.
>
> However, as the WP test suite does not cover the full code base, more
> instances of situations which fall under category 1 and 2 are expected to
> be discovered over time.
>
> Patches for any additional instances found, which fall under category 1
> or 2, can be uploaded to this ticket and this ticket should stay open for
> these kind of patches during the WordPress 6.1 release cycle.
>
> ----
>
> Related: #56009
>
> Trac ticket # is open for addressing dynamic properties in category 3 and
> 4.
New description:
Dynamic (non-explicitly declared) properties are deprecated as of PHP 8.2
and are expected to become a fatal error in PHP 9.0, though this last part
is not 100% certain yet.
RFC: https://wiki.php.net/rfc/deprecate_dynamic_properties
**This ticket is intended ONLY for category 1 and 2 (see below), where
fixing a typo or explicitly declaring the property fixes things.**
== The problem
=== What is a dynamic property ?
{{{#!php
<?php
class Foo {
public $id;
public function __construct( $id, $field_name ) {
// This is fine, the $id property exists on the class.
$this->id = $id;
// This is a dynamically created property as the property
// is not declared on the class.
$this->field_name = $field_name;
}
}
}}}
Dynamic properties can both be created from inside a class, like in the
above example, as well as from outside the class (see the below example),
which makes these issues very tricky to find via static analysis.
{{{#!php
<?php
$obj = new Foo();
$obj->type = 'something';
}}}
=== When is something not a dynamic property ?
1. When the property is explicitly declared on the class.
2. When the property is explicitly declared on the (grand)parent class.
=== When are dynamic properties not problematic ?
1. When the class, or one of its parents, has a magic `__set()` method
which assigns the property to a declared property.
{{{#!php
<?php
class Foo {
private $fields = [];
public function __construct($field_name ) {
$this->field_name = $field_name; // Not problematic.
}
public function __set( $name, $value ) {
$this->fields[ $name ] = $value;
}
}
}}}
2. When the class, or its parent, extends the PHP native `stdClass`, which
has highly optimized versions of the `__set()` magic method available.
== Mitigation
The solution needed depends on the specific situation and each instance
where a deprecation is thrown needs to be individually evaluated.
We can basically categorize dynamic properties into four base situations:
|| ||= Situation =||= Solution =||
|| 1. || Typo in property name || Fix the typo, either in the property as
declared or where the property assignment happens ||
|| 2. || Known, named, dynamic property || Declare the property on the
(parent) class ||
|| 3. || Known use of unknown dynamic properties || Declare the full set
of magic methods on a class (preferred) or let the class extend `stdClass`
(discouraged) ||
|| 4. || Unknown use of unknown dynamic properties || Use the
`#[AllowDynamicProperties] attribute on the (parent) class and/or declare
the full set of magic methods on a class and/or let the class extend
`stdClass` ||
Note: the `#[AllowDynamicProperties]` attribute is expected to be a
temporary solution and it is expected that support for the attribute will
be removed at some point in the future.
== Patches
**Reminder: This ticket is intended ONLY for patches which fall in
category 1 and 2, where fixing a typo or explicitly declaring the property
fixes things.**
A full set of patches for all such ''known'' situations - based on running
the WP test suite against PHP 8.2 - is available and PRs for each will be
opened on GitHub with a link to this ticket.
However, as the WP test suite does not cover the full code base, more
instances of situations which fall under category 1 and 2 are expected to
be discovered over time.
Patches for any additional instances found, which fall under category 1 or
2, can be uploaded to this ticket and this ticket should stay open for
these kind of patches during the WordPress 6.1 release cycle.
----
Related: #56009
Trac ticket #56034 is open for addressing dynamic properties in category 3
and 4.
--
--
Ticket URL: <https://core.trac.wordpress.org/ticket/56033#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list