Code Modernization: Remove dynamic properties in WP_UnitTestCase_Base.

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

In this particular case, the `scandir()` method sets a dynamic `$matched_dirs` property, which is subsequently used in the `delete_folders()` method.

This commit removes the need for the property. Effectively, this changes the `scandir()` method to return an array of the matched directories instead of setting the property by using recursion in the method itself in an optimized manner.

Note the `array_merge()` not being in the loop itself, but at the very end of the function. This is for performance reasons, see [https://github.com/dseguy/clearPHP/blob/master/rules/no-array_merge-in-loop.md clearPHP: No array_merge() In Loops] for a more detailed explanation of this.

It has been verified in detail that the actual results of the previous version of the method and this version match, even when the paths passed are more complex and have deeper nested subdirectories.

Follow-up to [30658], [53557], [53558], [53850], [53851], [53852], [53853], [53854], [53856], [53916], [53935], [53936].

Props jrf, johnbillion, markjaquith, SergeyBiryukov.
See #56033.

git-svn-id: https://develop.svn.wordpress.org/trunk@53937 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov 2022-08-24 13:49:36 +00:00
parent 6a854ec257
commit 28716eb8a6

View File

@ -1421,35 +1421,51 @@ abstract class WP_UnitTestCase_Base extends PHPUnit_Adapter_TestCase {
* @param string $path Path to the directory to scan.
*/
public function delete_folders( $path ) {
$this->matched_dirs = array();
if ( ! is_dir( $path ) ) {
return;
}
$this->scandir( $path );
foreach ( array_reverse( $this->matched_dirs ) as $dir ) {
$matched_dirs = $this->scandir( $path );
foreach ( array_reverse( $matched_dirs ) as $dir ) {
rmdir( $dir );
}
rmdir( $path );
}
/**
* Retrieves all directories contained inside a directory and stores them in the `$matched_dirs` property.
* Retrieves all directories contained inside a directory.
* Hidden directories are ignored.
*
* This is a helper for the `delete_folders()` method.
*
* @since 4.1.0
* @since 6.1.0 No longer sets a (dynamic) property to keep track of the directories,
* but returns an array of the directories instead.
*
* @param string $dir Path to the directory to scan.
* @return string[] List of directories.
*/
public function scandir( $dir ) {
$matched_dirs = array();
foreach ( scandir( $dir ) as $path ) {
if ( 0 !== strpos( $path, '.' ) && is_dir( $dir . '/' . $path ) ) {
$this->matched_dirs[] = $dir . '/' . $path;
$this->scandir( $dir . '/' . $path );
$matched_dirs[] = array( $dir . '/' . $path );
$matched_dirs[] = $this->scandir( $dir . '/' . $path );
}
}
/*
* Compatibility check for PHP < 7.4, where array_merge() expects at least one array.
* See: https://3v4l.org/BIQMA
*/
if ( array() === $matched_dirs ) {
return array();
}
return array_merge( ...$matched_dirs );
}
/**