-
Notifications
You must be signed in to change notification settings - Fork 3.2k
PHP 8.4 | Remove use of xml_set_object() [3] (Trac 62061) #7372
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Dynamic (non-explicitly declared) properties are deprecated as of PHP 8.2 and are expected to become a fatal error in PHP 9.0. There are a number of ways to mitigate this: * If it's an accidental typo for a declared property: fix the typo. * For known properties: declare them on the class. * For unknown properties: add the magic `__get()`, `__set()` et al methods to the class or let the class extend `stdClass` which has highly optimized versions of these magic methods build in. * For unknown _use of_ dynamic properties, the `#[AllowDynamicProperties]` attribute can be added to the class. The attribute will automatically be inherited by child classes. In this case, the property added are explicitly referenced in this class, so fall in the "known property" category. Refs: * https://wiki.php.net/rfc/deprecate_dynamic_properties
The XML Parser extension still supports a quite dated mechanism for method based callbacks, where the object is first set via `xml_set_object()` and the callbacks are then set by passing only the name of the method to the relevant parameters on any of the `xml_set_*_handler()` functions. ```php xml_set_object( $parser, $my_obj ); xml_set_character_data_handler( $parser, 'method_name_on_my_obj' ); ``` Passing proper callables to the `xml_set_*_handler()` functions has been supported for the longest time and is cross-version compatible. So the above code is 100% equivalent to: ```php xml_set_character_data_handler( $parser, [$my_obj, 'method_name_on_my_obj'] ); ``` The mechanism of setting the callbacks with `xml_set_object()` has now been deprecated as of PHP 8.4, in favour of passing proper callables to the `xml_set_*_handler()` functions. This is also means that calling the `xml_set_object()` function is deprecated as well. This commit fixes this deprecation for the `AtomParser::parse()` method. This change is safeguarded via the new `AtomParser_Parse_Test` class. Notes: * I recognize that this is "officially" an external library, but AFAIK, this package is no longer externally maintained. The code style of the fix in the source file is in line with the existing code style for the file. * It appears that this class is not actually used by WP Core itself, so it could be considered to deprecate the class. However, as the class is not currently deprecated, safeguarding the change with a test seemed prudent. * The fixture used for the test reuses a fixture from the original package: https://code.google.com/archive/p/phpatomlib/source/default/source * The new test class follows the recommended test format (naming convention of the class, `@covers` tag at class level, only testing one method) as per Trac tickets 62004 / 53010. Refs: * https://wiki.php.net/rfc/deprecations_php_8_4#xml_set_object_and_xml_set_handler_with_string_method_names * https://www.php.net/manual/en/function.xml-set-object.php * https://www.php.net/manual/en/ref.xml.php
|
The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the Core Committers: Use this line as a base for the props when committing in SVN: To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. |
|
0e237e3 committed via https://core.trac.wordpress.org/changeset/59058 ✅ (linked it to the Trac epic ticket for handling dynamic properties). |
hellofromtonya
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM and ready for commit 👍
Also like how the new test file is named for the PHPUnit 11+ effort https://core.trac.wordpress.org/ticket/53010 🎉
|
58d69a6 committed via https://core.trac.wordpress.org/changeset/59062 ✅ |
Note: the first commit is necessary to allow the tests being added in the second commit to pass.
PHP 8.2 | AtomParser: explicitly declare all properties
Dynamic (non-explicitly declared) properties are deprecated as of PHP 8.2 and are expected to become a fatal error in PHP 9.0.
There are a number of ways to mitigate this:
__get(),__set()et al methods to the class or let the class extendstdClasswhich has highly optimized versions of these magic methods build in.#[AllowDynamicProperties]attribute can be added to the class. The attribute will automatically be inherited by child classes.In this case, the property added are explicitly referenced in this class, so fall in the "known property" category.
Refs:
PHP 8.4 | Remove use of xml_set_object() [3]
The XML Parser extension still supports a quite dated mechanism for method based callbacks, where the object is first set via
xml_set_object()and the callbacks are then set by passing only the name of the method to the relevant parameters on any of thexml_set_*_handler()functions.Passing proper callables to the
xml_set_*_handler()functions has been supported for the longest time and is cross-version compatible. So the above code is 100% equivalent to:The mechanism of setting the callbacks with
xml_set_object()has now been deprecated as of PHP 8.4, in favour of passing proper callables to thexml_set_*_handler()functions. This is also means that calling thexml_set_object()function is deprecated as well.This commit fixes this deprecation for the
AtomParser::parse()method.This change is safeguarded via the new
AtomParser_Parse_Testclass.Notes:
@coverstag at class level, only testing one method) as per Trac tickets 62004 / 53010.Refs:
Trac ticket: https://core.trac.wordpress.org/ticket/62061
This Pull Request is for code review only. Please keep all other discussion in the Trac ticket. Do not merge this Pull Request. See GitHub Pull Requests for Code Review in the Core Handbook for more details.