[wp-trac] [WordPress Trac] #53858: PHP 8.1: syntax error due to new 'readonly' property

WordPress Trac noreply at wordpress.org
Mon Aug 2 11:47:14 UTC 2021


#53858: PHP 8.1: syntax error due to new 'readonly' property
----------------------------------------------+---------------------
 Reporter:  haosun                            |       Owner:  (none)
     Type:  defect (bug)                      |      Status:  new
 Priority:  normal                            |   Milestone:  5.9
Component:  General                           |     Version:  4.9
 Severity:  normal                            |  Resolution:
 Keywords:  needs-patch php81 needs-dev-note  |     Focuses:
----------------------------------------------+---------------------
Changes (by jrf):

 * keywords:  needs-patch php81 => needs-patch php81 needs-dev-note


Comment:

 > I know. I meant (by 'calls') that the `readonly()` alias just should
 call the new `wp_readonly()`, and only be defined in case PHP < 8.1.
 >
 > Renaming to `wp_readonly()` and making `readonly()` an alias of that on
 PHP < 8.1 sounds reasonable as long as it doesn't cause syntax errors
 anymore. It should be marked as deprecated though.

 I've read through the discussion so far and would like to add some
 observations:
 1. This function ''is'' used in - at least in userland code -, though
 luckily not very often. Here is a
 [https://wpdirectory.net/search/01FC39KK20BEK3V06X1PSBDQJV WP Directory
 plugin search] showing this. Lots of false positives for JS code, but also
 some real uses and even polyfill declarations for when WP didn't have the
 function yet. A [https://wpdirectory.net/search/01FC3A2BFQARC0EMYY2CAYGTBF
 Theme Search for the same] did not yield any valid results.
 2. While this will be even more difficult to search for, the function
 ''may'' also be used as a callback via `add_filter()`. To be honest, I
 wouldn't be surprised if that type of use exists in the WP Core codebase,
 though I haven't done a search for it (yet). In that case, in PHP 8.1, I
 expect this will result in a run-time fatal error when `readonly` gets
 called via `apply_filters()`. This type of use definitely also
 [https://wpdirectory.net/search/01FC3AQG97EF12JQ1M2H6RSWD1 exists in
 plugins], like can be seen in the "Booster for WooCommerce" plugin.
 3. A plain renaming of the function is a BC-break which is unacceptable in
 the WP landscape as it **will** break integrations.
 4. Aliasing the function in the manner @swissspidy suggest in `wp-
 includes/deprecated.php` will not work as `readonly` will now be full
 keyword in PHP, which means that loading the file with the original
 deprecated function would yield a parse error in PHP 8.1, i.e. result in a
 white screen of death.

 > Btw: I wonder if just enclosing the function in an if statement is
 enough. Maybe we have to include a file conditionally?

 So yes, to move forward, I'd like to suggest the following:
 1. Rename the function in place.
 2. Add a **new** file which only contains the old, deprecated `readonly`
 function and - this is the important part - **only load this file
 conditionally when PHP < 8.1 is detected**.

 Plugins/themes which use the function **and** want to support PHP 8.1 will
 need to switch to the new function name ASAP, as ''calls'' to the
 `readonly()` function in their code on PHP 8.1 will be a parse error just
 the same.

 This should get a prominent mention in the WP 5.9 dev-note about PHP 8.1.

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


More information about the wp-trac mailing list