[wp-trac] [WordPress Trac] #56876: Dynamic Properties: Fix magic methods in WP_List_Table, WP_User_Query, WP_Text_Diff_Renderer_Table and WP_Admin_Bar classes

WordPress Trac noreply at wordpress.org
Tue Mar 21 19:59:01 UTC 2023


#56876: Dynamic Properties: Fix magic methods in WP_List_Table, WP_User_Query,
WP_Text_Diff_Renderer_Table and WP_Admin_Bar classes
-------------------------------------------------+-------------------------
 Reporter:  antonvlasenko                        |       Owner:
                                                 |  hellofromTonya
     Type:  defect (bug)                         |      Status:  reviewing
 Priority:  normal                               |   Milestone:  6.3
Component:  Administration                       |     Version:
 Severity:  normal                               |  Resolution:
 Keywords:  has-patch has-unit-tests php82       |     Focuses:
  early commit                                   |
-------------------------------------------------+-------------------------

Comment (by hellofromTonya):

 In [changeset:"55580" 55580]:
 {{{
 #!CommitTicketReference repository="" revision="55580"
 Code Modernization: Fix dynamic properties in WP_Admin_Bar.

 To fix the dynamic properties, the following changes are included:
 * Removes `WP_Admin_Bar::__get()`.
 * Declares `menu` as a property on the class, deprecates it, and
 initializes it to an empty array.
 * Removes the unused 'proto' dynamic property.

 Dynamic (non-explicitly declared) properties are deprecated as of PHP 8.2
 and are expected to become a fatal error in PHP 9.0.

 == Why remove the `WP_Admin_Bar::__get()` magic method?

 tl;dr
 The magic method is no longer needed.

 The magic method only handled the `menu` and `proto` dynamic properties.
 Introducing a full set of magic methods is overkill for this class.
 Instead of having to maintain magic methods, this changeset instead
 directly addresses the 2 properties (see below).

 == Why declare the `menu` property on the class?

 tl;dr
 To simplify the code while maintaining backwards compatibility for
 extenders who are using this deprecated property.

 The `menu` property was introduced during the 3.1.0 ''development cycle''
 as a declared property [15671]. Its purpose was to ''internally'' hold the
 menu structure.

 During the WP 3.3.0 development cycle, it was replaced by a new `private`
 property called `nodes` (see [19120]).

 But breakage reports from extenders caused it to be restored. [19501]
 added the `__get()` magic method, i.e. for handling it as a dynamic
 property, and deprecated it.

 >We're not going to maintain compat for $menu. Suggest we make it array()
 and plugins will have to deal. We can throw a _deprecated_argument() and
 push them to use the new methods.
 ~ Source: [https://core.trac.wordpress.org/ticket/19371#comment:17 see
 #19371 comment 17]

 [https://wpdirectory.net/search/01GSTW1X69TBN8FH3SY7V8KPY5 A search of the
 wp.org plugins and themes repository] shows that a few plugins are still
 using this deprecated property. To maintain backwards compatibility,
 `menu` is moved back to the class as a declared property, set to an empty
 array (as it's been since 3.3.0), and deprecated in the property's
 description.

 == Why remove the `proto` dynamic property?

 tl;dr
 * It was not intended to be released in 3.1.
 * There are no usages of it in Core or in the WP.org's plugin or theme
 directories.
 * It should be safe to remove.

 This property was first introduced in the WP 3.1.0 ''development cycle''
 to replace the `PROTO` constant (see [16038]) for protocol handling for
 the admin bar's hyperlinks. [16077] replaced the property's usages with
 URL functions such as `get_admin_url()` and `admin_url()`. But it missed
 removing the property, which was no longer needed or used.

 It was relocated to the `__get()` magic method as a dynamic property when
 the `menu` property was restored (see [19501]).

 A search of WP.org's plugins and themes repositories shows no usages of
 the property. Core hasn't used it since the removed in [16038] before 3.1
 final release. It should be safe to remove it, but committing very early
 in the 6.3 alpha cycle to give time for reports of usages, if there are
 any.

 References:
 * A [https://www.youtube.com/watch?v=vDZWepDQQVE&t=9362s live open public
 working session] where these changes were discussed and agreed to.
 * [https://wiki.php.net/rfc/deprecate_dynamic_properties PHP RFC:
 Deprecate dynamic properties].

 Follow-up to [19501], [19120], [16308], [16038], [15671].

 Props antonvlasenko, hellofromTonya, jrf, markjaquith, desrosj,
 ironprogrammer, peterwilsoncc, SergeyBiryukov.
 See #56876, #56034.
 }}}

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/56876#comment:32>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list