From 7b4489e019092fd082e567cd79448f39677108c4 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Mon, 8 Oct 2018 17:10:45 +0300 Subject: [PATCH] Get rid of unnecessary func_get_args() and friends HHVM does not support variadic arguments with type hints. This is mostly not a big problem, because we can just drop the type hint, but for some reason PHPUnit adds a type hint of "array" when it creates mocks, so a class with a variadic method can't be mocked (at least in some cases). As such, I left alone all the classes that seem like someone might like to mock them, like Title and User. If anyone wants to mock them in the future, they'll have to switch back to func_get_args(). Some of the changes are definitely safe, like functions and test classes. In most cases, func_get_args() (and/or func_get_arg(), func_num_args() ) were only present because the code was written before we required PHP 5.6, and writing them as variadic functions is strictly superior. In some cases I left them alone, aside from HHVM compatibility: * Forwarding all arguments to another function. It's useful to keep func_get_args() here where we want to keep the list of expected arguments and their meanings in the function signature line for documentation purposes, but don't want to copy-paste a long line of argument names. * Handling deprecated calling conventions. * One or two miscellaneous cases where we're basically using the arguments individually but want to use them as an array as well for some reason. Change-Id: I066ec95a7beb7c0665146195a08e7cce1222c788 --- img_auth.php | 7 ++--- includes/SiteConfiguration.php | 8 +++--- includes/api/ApiAuthManagerHelper.php | 6 ++-- includes/exception/MWException.php | 9 +++--- includes/exception/MWExceptionRenderer.php | 9 +++--- includes/htmlform/HTMLFormField.php | 4 +-- includes/import/WikiImporter.php | 11 ++------ includes/installer/CliInstaller.php | 13 ++++----- includes/installer/Installer.php | 6 ++-- includes/installer/WebInstaller.php | 28 +++++++++---------- includes/libs/ArrayUtils.php | 6 ++-- includes/libs/DeferredStringifier.php | 7 ++--- includes/libs/MemoizedCallable.php | 6 ++-- includes/libs/filebackend/FileBackend.php | 5 ++-- includes/libs/jsminplus.php | 8 ++---- includes/media/MediaTransformError.php | 3 +- includes/media/ThumbnailImage.php | 2 +- includes/parser/CoreParserFunctions.php | 17 ++++++----- includes/parser/Preprocessor_DOM.php | 22 ++++++--------- includes/parser/Preprocessor_Hash.php | 22 ++++++--------- includes/shell/Command.php | 10 +++---- includes/specials/helpers/ImportReporter.php | 7 ++--- maintenance/storage/recompressTracked.php | 3 +- .../includes/Storage/NameTableStoreTest.php | 16 +++++------ .../includes/api/query/ApiQueryTestBase.php | 8 +++--- .../UserDataAuthenticationRequestTest.php | 3 +- .../changes/CategoryMembershipChangeTest.php | 4 +-- .../phpunit/includes/libs/ArrayUtilsTest.php | 4 +-- .../includes/poolcounter/PoolCounterTest.php | 4 +-- .../WatchedItemQueryServiceUnitTest.php | 3 +- .../watcheditem/WatchedItemStoreUnitTest.php | 4 +-- 31 files changed, 112 insertions(+), 153 deletions(-) diff --git a/img_auth.php b/img_auth.php index e6b6e1b67e..0a209e98b4 100644 --- a/img_auth.php +++ b/img_auth.php @@ -186,13 +186,12 @@ function wfImageAuthMain() { * subsequent arguments to $msg2 will be passed as parameters only for replacing in $msg2 * @param string $msg1 * @param string $msg2 + * @param mixed ...$args To pass as params to wfMessage() with $msg2. Either variadic, or a single + * array argument. */ -function wfForbidden( $msg1, $msg2 ) { +function wfForbidden( $msg1, $msg2, ...$args ) { global $wgImgAuthDetails; - $args = func_get_args(); - array_shift( $args ); - array_shift( $args ); $args = ( isset( $args[0] ) && is_array( $args[0] ) ) ? $args[0] : $args; $msgHdr = wfMessage( $msg1 )->escaped(); diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php index b400797c58..cab98a7c63 100644 --- a/includes/SiteConfiguration.php +++ b/includes/SiteConfiguration.php @@ -582,14 +582,14 @@ class SiteConfiguration { * which is not fun * * @param array $array1 + * @param array ...$arrays * * @return array */ - static function arrayMerge( $array1/* ... */ ) { + static function arrayMerge( array $array1, ...$arrays ) { $out = $array1; - $argsCount = func_num_args(); - for ( $i = 1; $i < $argsCount; $i++ ) { - foreach ( func_get_arg( $i ) as $key => $value ) { + foreach ( $arrays as $array ) { + foreach ( $array as $key => $value ) { if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) { $out[$key] = self::arrayMerge( $out[$key], $value ); } elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) { diff --git a/includes/api/ApiAuthManagerHelper.php b/includes/api/ApiAuthManagerHelper.php index e37b4d481d..2f66277ec4 100644 --- a/includes/api/ApiAuthManagerHelper.php +++ b/includes/api/ApiAuthManagerHelper.php @@ -345,10 +345,10 @@ class ApiAuthManagerHelper { /** * Fetch the standard parameters this helper recognizes * @param string $action AuthManager action - * @param string $param,... Parameters to use + * @param string ...$wantedParams Parameters to use * @return array */ - public static function getStandardParams( $action, $param /* ... */ ) { + public static function getStandardParams( $action, ...$wantedParams ) { $params = [ 'requests' => [ ApiBase::PARAM_TYPE => 'string', @@ -384,8 +384,6 @@ class ApiAuthManagerHelper { ]; $ret = []; - $wantedParams = func_get_args(); - array_shift( $wantedParams ); foreach ( $wantedParams as $name ) { if ( isset( $params[$name] ) ) { $ret[$name] = $params[$name]; diff --git a/includes/exception/MWException.php b/includes/exception/MWException.php index 502cee82b7..cb7ff19b35 100644 --- a/includes/exception/MWException.php +++ b/includes/exception/MWException.php @@ -69,23 +69,22 @@ class MWException extends Exception { * @param string $key Message name * @param string $fallback Default message if the message cache can't be * called by the exception - * The function also has other parameters that are arguments for the message + * @param mixed ...$params To pass to wfMessage() * @return string Message with arguments replaced */ - public function msg( $key, $fallback /*[, params...] */ ) { + public function msg( $key, $fallback, ...$params ) { global $wgSitename; - $args = array_slice( func_get_args(), 2 ); // FIXME: Keep logic in sync with MWExceptionRenderer::msg. $res = false; if ( $this->useMessageCache() ) { try { - $res = wfMessage( $key, $args )->text(); + $res = wfMessage( $key, $params )->text(); } catch ( Exception $e ) { } } if ( $res === false ) { - $res = wfMsgReplaceArgs( $fallback, $args ); + $res = wfMsgReplaceArgs( $fallback, $params ); // If an exception happens inside message rendering, // {{SITENAME}} sometimes won't be replaced. $res = strtr( $res, [ diff --git a/includes/exception/MWExceptionRenderer.php b/includes/exception/MWExceptionRenderer.php index 66775bf61f..c52a867865 100644 --- a/includes/exception/MWExceptionRenderer.php +++ b/includes/exception/MWExceptionRenderer.php @@ -191,18 +191,17 @@ class MWExceptionRenderer { * @param string $key Message name * @param string $fallback Default message if the message cache can't be * called by the exception - * The function also has other parameters that are arguments for the message + * @param mixed ...$params To pass to wfMessage() * @return string Message with arguments replaced */ - private static function msg( $key, $fallback /*[, params...] */ ) { + private static function msg( $key, $fallback, ...$params ) { global $wgSitename; - $args = array_slice( func_get_args(), 2 ); // FIXME: Keep logic in sync with MWException::msg. try { - $res = wfMessage( $key, $args )->text(); + $res = wfMessage( $key, $params )->text(); } catch ( Exception $e ) { - $res = wfMsgReplaceArgs( $fallback, $args ); + $res = wfMsgReplaceArgs( $fallback, $params ); // If an exception happens inside message rendering, // {{SITENAME}} sometimes won't be replaced. $res = strtr( $res, [ diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php index 16dc46591b..0702635e4f 100644 --- a/includes/htmlform/HTMLFormField.php +++ b/includes/htmlform/HTMLFormField.php @@ -77,9 +77,7 @@ abstract class HTMLFormField { * * @return Message */ - public function msg() { - $args = func_get_args(); - + public function msg( ...$args ) { if ( $this->mParent ) { return $this->mParent->msg( ...$args ); } diff --git a/includes/import/WikiImporter.php b/includes/import/WikiImporter.php index 41ec673a18..466e3d873c 100644 --- a/includes/import/WikiImporter.php +++ b/includes/import/WikiImporter.php @@ -120,10 +120,7 @@ class WikiImporter { wfDebug( "IMPORT: $data\n" ); } - public function notice( $msg /*, $param, ...*/ ) { - $params = func_get_args(); - array_shift( $params ); - + public function notice( $msg, ...$params ) { if ( is_callable( $this->mNoticeCallback ) ) { call_user_func( $this->mNoticeCallback, $msg, $params ); } else { # No ImportReporter -> CLI @@ -430,8 +427,7 @@ class WikiImporter { } } - $args = func_get_args(); - return Hooks::run( 'AfterImportPage', $args ); + return Hooks::run( 'AfterImportPage', func_get_args() ); } /** @@ -486,8 +482,7 @@ class WikiImporter { private function pageOutCallback( $title, $foreignTitle, $revCount, $sucCount, $pageInfo ) { if ( isset( $this->mPageOutCallback ) ) { - $args = func_get_args(); - call_user_func_array( $this->mPageOutCallback, $args ); + call_user_func_array( $this->mPageOutCallback, func_get_args() ); } } diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php index 7267ddd2f3..c008333e47 100644 --- a/includes/installer/CliInstaller.php +++ b/includes/installer/CliInstaller.php @@ -200,24 +200,23 @@ class CliInstaller extends Installer { $this->showMessage( 'config-install-step-done' ); } - public function showMessage( $msg /*, ... */ ) { - echo $this->getMessageText( func_get_args() ) . "\n"; + public function showMessage( $msg, ...$params ) { + echo $this->getMessageText( $msg, $params ) . "\n"; flush(); } - public function showError( $msg /*, ... */ ) { - echo "***{$this->getMessageText( func_get_args() )}***\n"; + public function showError( $msg, ...$params ) { + echo "***{$this->getMessageText( $msg, $params )}***\n"; flush(); } /** + * @param string $msg * @param array $params * * @return string */ - protected function getMessageText( $params ) { - $msg = array_shift( $params ); - + protected function getMessageText( $msg, $params ) { $text = wfMessage( $msg, $params )->parse(); $text = preg_replace( '/(.*?)<\/a>/', '$2 <$1>', $text ); diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index ea022bb5f0..9053f8d195 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -336,14 +336,16 @@ abstract class Installer { * The messages will be in wikitext format, which will be converted to an * output format such as HTML or text before being sent to the user. * @param string $msg + * @param mixed ...$params */ - abstract public function showMessage( $msg /*, ... */ ); + abstract public function showMessage( $msg, ...$params ); /** * Same as showMessage(), but for displaying errors * @param string $msg + * @param mixed ...$params */ - abstract public function showError( $msg /*, ... */ ); + abstract public function showError( $msg, ...$params ); /** * Show a message to the installing user by using a Status object diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php index 2d12e62de8..0a6be86ba5 100644 --- a/includes/installer/WebInstaller.php +++ b/includes/installer/WebInstaller.php @@ -374,13 +374,14 @@ class WebInstaller extends Installer { * Show an error message in a box. Parameters are like wfMessage(), or * alternatively, pass a Message object in. * @param string|Message $msg + * @param mixed ...$params */ - public function showError( $msg /*...*/ ) { + public function showError( $msg, ...$params ) { if ( !( $msg instanceof Message ) ) { - $args = func_get_args(); - array_shift( $args ); - $args = array_map( 'htmlspecialchars', $args ); - $msg = wfMessage( $msg, $args ); + $msg = wfMessage( + $msg, + array_map( 'htmlspecialchars', $params ) + ); } $text = $msg->useDatabase( false )->plain(); $this->output->addHTML( $this->getErrorBox( $text ) ); @@ -675,9 +676,7 @@ class WebInstaller extends Installer { * @param string $msg * @return string */ - public function getHelpBox( $msg /*, ... */ ) { - $args = func_get_args(); - array_shift( $args ); + public function getHelpBox( $msg, ...$args ) { $args = array_map( 'htmlspecialchars', $args ); $text = wfMessage( $msg, $args )->useDatabase( false )->plain(); $html = $this->parse( $text, true ); @@ -693,10 +692,10 @@ class WebInstaller extends Installer { /** * Output a help box. * @param string $msg Key for wfMessage() + * @param mixed ...$params */ - public function showHelpBox( $msg /*, ... */ ) { - $args = func_get_args(); - $html = $this->getHelpBox( ...$args ); + public function showHelpBox( $msg, ...$params ) { + $html = $this->getHelpBox( $msg, ...$params ); $this->output->addHTML( $html ); } @@ -705,12 +704,11 @@ class WebInstaller extends Installer { * Output looks like a list. * * @param string $msg + * @param mixed ...$params */ - public function showMessage( $msg /*, ... */ ) { - $args = func_get_args(); - array_shift( $args ); + public function showMessage( $msg, ...$params ) { $html = '
' . - $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) . + $this->parse( wfMessage( $msg, $params )->useDatabase( false )->plain() ) . "
\n"; $this->output->addHTML( $html ); } diff --git a/includes/libs/ArrayUtils.php b/includes/libs/ArrayUtils.php index e23888779f..ccc76bb77b 100644 --- a/includes/libs/ArrayUtils.php +++ b/includes/libs/ArrayUtils.php @@ -151,13 +151,11 @@ class ArrayUtils { * @since 1.23 * * @param array $array1 The array to compare from - * @param array $array2,... More arrays to compare against + * @param array ...$arrays More arrays to compare against * @return array An array containing all the values from array1 * that are not present in any of the other arrays. */ - public static function arrayDiffAssocRecursive( $array1 ) { - $arrays = func_get_args(); - array_shift( $arrays ); + public static function arrayDiffAssocRecursive( $array1, ...$arrays ) { $ret = []; foreach ( $array1 as $key => $value ) { diff --git a/includes/libs/DeferredStringifier.php b/includes/libs/DeferredStringifier.php index 94704133ae..7de60b1d5c 100644 --- a/includes/libs/DeferredStringifier.php +++ b/includes/libs/DeferredStringifier.php @@ -36,12 +36,11 @@ class DeferredStringifier { /** * @param callable $callback Callback that gets called by __toString - * @param mixed $param,... Parameters to the callback + * @param mixed ...$params Parameters to the callback */ - public function __construct( $callback /*...*/ ) { - $this->params = func_get_args(); - array_shift( $this->params ); + public function __construct( $callback, ...$params ) { $this->callback = $callback; + $this->params = $params; } /** diff --git a/includes/libs/MemoizedCallable.php b/includes/libs/MemoizedCallable.php index e9d1fc1ca3..5e7485c279 100644 --- a/includes/libs/MemoizedCallable.php +++ b/includes/libs/MemoizedCallable.php @@ -135,11 +135,11 @@ class MemoizedCallable { * * Like MemoizedCallable::invokeArgs(), but variadic. * - * @param mixed $params,... Parameters for memoized function or method. + * @param mixed ...$params Parameters for memoized function or method. * @return mixed The memoized callable's return value. */ - public function invoke() { - return $this->invokeArgs( func_get_args() ); + public function invoke( ...$params ) { + return $this->invokeArgs( $params ); } /** diff --git a/includes/libs/filebackend/FileBackend.php b/includes/libs/filebackend/FileBackend.php index 7bc3045c49..53a0ca040f 100644 --- a/includes/libs/filebackend/FileBackend.php +++ b/includes/libs/filebackend/FileBackend.php @@ -1575,11 +1575,10 @@ abstract class FileBackend implements LoggerAwareInterface { * - StatusValue::newGood() if this method is called without parameters * - StatusValue::newFatal() with all parameters to this method if passed in * - * @param string $args,... + * @param string ...$args * @return StatusValue */ - final protected function newStatus() { - $args = func_get_args(); + final protected function newStatus( ...$args ) { if ( count( $args ) ) { $sv = StatusValue::newFatal( ...$args ); } else { diff --git a/includes/libs/jsminplus.php b/includes/libs/jsminplus.php index 3134e50cfa..0eab8608a4 100644 --- a/includes/libs/jsminplus.php +++ b/includes/libs/jsminplus.php @@ -1700,7 +1700,7 @@ class JSNode public $funDecls = array(); public $varDecls = array(); - public function __construct($t, $type=0) + public function __construct($t, $type=0, ...$nodes) { if ($token = $t->currentToken()) { @@ -1716,11 +1716,9 @@ class JSNode $this->lineno = $t->lineno; } - if (($numargs = func_num_args()) > 2) + foreach($nodes as $node) { - $args = func_get_args(); - for ($i = 2; $i < $numargs; $i++) - $this->addNode($args[$i]); + $this->addNode($node); } } diff --git a/includes/media/MediaTransformError.php b/includes/media/MediaTransformError.php index f3b5d8f809..fb1b015a71 100644 --- a/includes/media/MediaTransformError.php +++ b/includes/media/MediaTransformError.php @@ -30,8 +30,7 @@ class MediaTransformError extends MediaTransformOutput { /** @var Message */ private $msg; - function __construct( $msg, $width, $height /*, ... */ ) { - $args = array_slice( func_get_args(), 3 ); + function __construct( $msg, $width, $height, ...$args ) { $this->msg = wfMessage( $msg )->params( $args ); $this->width = intval( $width ); $this->height = intval( $height ); diff --git a/includes/media/ThumbnailImage.php b/includes/media/ThumbnailImage.php index 0deb89fcc4..36cf4228e5 100644 --- a/includes/media/ThumbnailImage.php +++ b/includes/media/ThumbnailImage.php @@ -112,7 +112,7 @@ class ThumbnailImage extends MediaTransformOutput { function toHtml( $options = [] ) { global $wgPriorityHints, $wgElementTiming; - if ( count( func_get_args() ) == 2 ) { + if ( func_num_args() == 2 ) { throw new MWException( __METHOD__ . ' called in the old style' ); } diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index b2b7486918..7ce96bebaf 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -90,13 +90,13 @@ class CoreParserFunctions { /** * @param Parser $parser - * @param string $part1 + * @param string $part1 Message key + * @param mixed ...$params To pass to wfMessage() * @return array */ - public static function intFunction( $parser, $part1 = '' /*, ... */ ) { + public static function intFunction( $parser, $part1 = '', ...$params ) { if ( strval( $part1 ) !== '' ) { - $args = array_slice( func_get_args(), 2 ); - $message = wfMessage( $part1, $args ) + $message = wfMessage( $part1, $params ) ->inLanguage( $parser->getOptions()->getUserLangObj() ); return [ $message->plain(), 'noparse' => false ]; } else { @@ -313,11 +313,10 @@ class CoreParserFunctions { /** * @param Parser $parser * @param string $username + * @param string ...$forms What to output for each gender * @return string */ - public static function gender( $parser, $username ) { - $forms = array_slice( func_get_args(), 2 ); - + public static function gender( $parser, $username, ...$forms ) { // Some shortcuts to avoid loading user data unnecessarily if ( count( $forms ) === 0 ) { return ''; @@ -351,10 +350,10 @@ class CoreParserFunctions { /** * @param Parser $parser * @param string $text + * @param string ...$forms What to output for each number (singular, dual, plural, etc.) * @return string */ - public static function plural( $parser, $text = '' ) { - $forms = array_slice( func_get_args(), 2 ); + public static function plural( $parser, $text = '', ...$forms ) { $text = $parser->getFunctionLang()->parseFormattedNumber( $text ); settype( $text, ctype_digit( $text ) ? 'int' : 'float' ); return $parser->getFunctionLang()->convertPlural( $text, $forms ); diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php index 4ed6b791fe..c27a635e04 100644 --- a/includes/parser/Preprocessor_DOM.php +++ b/includes/parser/Preprocessor_DOM.php @@ -1421,12 +1421,10 @@ class PPFrame_DOM implements PPFrame { /** * @param string $sep * @param int $flags - * @param string|PPNode_DOM|DOMDocument $args,... + * @param string|PPNode_DOM|DOMDocument ...$args * @return string */ - public function implodeWithFlags( $sep, $flags /*, ... */ ) { - $args = array_slice( func_get_args(), 2 ); - + public function implodeWithFlags( $sep, $flags, ...$args ) { $first = true; $s = ''; foreach ( $args as $root ) { @@ -1453,12 +1451,10 @@ class PPFrame_DOM implements PPFrame { * This previously called implodeWithFlags but has now been inlined to reduce stack depth * * @param string $sep - * @param string|PPNode_DOM|DOMDocument $args,... + * @param string|PPNode_DOM|DOMDocument ...$args * @return string */ - public function implode( $sep /*, ... */ ) { - $args = array_slice( func_get_args(), 1 ); - + public function implode( $sep, ...$args ) { $first = true; $s = ''; foreach ( $args as $root ) { @@ -1485,11 +1481,10 @@ class PPFrame_DOM implements PPFrame { * with implode() * * @param string $sep - * @param string|PPNode_DOM|DOMDocument $args,... + * @param string|PPNode_DOM|DOMDocument ...$args * @return array */ - public function virtualImplode( $sep /*, ... */ ) { - $args = array_slice( func_get_args(), 1 ); + public function virtualImplode( $sep, ...$args ) { $out = []; $first = true; @@ -1517,11 +1512,10 @@ class PPFrame_DOM implements PPFrame { * @param string $start * @param string $sep * @param string $end - * @param string|PPNode_DOM|DOMDocument $args,... + * @param string|PPNode_DOM|DOMDocument ...$args * @return array */ - public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) { - $args = array_slice( func_get_args(), 3 ); + public function virtualBracketedImplode( $start, $sep, $end, ...$args ) { $out = [ $start ]; $first = true; diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php index eb869e21c3..dfce0a022b 100644 --- a/includes/parser/Preprocessor_Hash.php +++ b/includes/parser/Preprocessor_Hash.php @@ -1232,12 +1232,10 @@ class PPFrame_Hash implements PPFrame { /** * @param string $sep * @param int $flags - * @param string|PPNode $args,... + * @param string|PPNode ...$args * @return string */ - public function implodeWithFlags( $sep, $flags /*, ... */ ) { - $args = array_slice( func_get_args(), 2 ); - + public function implodeWithFlags( $sep, $flags, ...$args ) { $first = true; $s = ''; foreach ( $args as $root ) { @@ -1263,12 +1261,10 @@ class PPFrame_Hash implements PPFrame { * Implode with no flags specified * This previously called implodeWithFlags but has now been inlined to reduce stack depth * @param string $sep - * @param string|PPNode $args,... + * @param string|PPNode ...$args * @return string */ - public function implode( $sep /*, ... */ ) { - $args = array_slice( func_get_args(), 1 ); - + public function implode( $sep, ...$args ) { $first = true; $s = ''; foreach ( $args as $root ) { @@ -1295,11 +1291,10 @@ class PPFrame_Hash implements PPFrame { * with implode() * * @param string $sep - * @param string|PPNode $args,... + * @param string|PPNode ...$args * @return PPNode_Hash_Array */ - public function virtualImplode( $sep /*, ... */ ) { - $args = array_slice( func_get_args(), 1 ); + public function virtualImplode( $sep, ...$args ) { $out = []; $first = true; @@ -1328,11 +1323,10 @@ class PPFrame_Hash implements PPFrame { * @param string $start * @param string $sep * @param string $end - * @param string|PPNode $args,... + * @param string|PPNode ...$args * @return PPNode_Hash_Array */ - public function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) { - $args = array_slice( func_get_args(), 3 ); + public function virtualBracketedImplode( $start, $sep, $end, ...$args ) { $out = [ $start ]; $first = true; diff --git a/includes/shell/Command.php b/includes/shell/Command.php index 1dab7ebeb3..ba8133f246 100644 --- a/includes/shell/Command.php +++ b/includes/shell/Command.php @@ -111,11 +111,10 @@ class Command { * Adds parameters to the command. All parameters are sanitized via Shell::escape(). * Null values are ignored. * - * @param string|string[] $args,... + * @param string|string[] ...$args * @return $this */ - public function params( /* ... */ ) { - $args = func_get_args(); + public function params( ...$args ) { if ( count( $args ) === 1 && is_array( reset( $args ) ) ) { // If only one argument has been passed, and that argument is an array, // treat it as a list of arguments @@ -130,11 +129,10 @@ class Command { * Adds unsafe parameters to the command. These parameters are NOT sanitized in any way. * Null values are ignored. * - * @param string|string[] $args,... + * @param string|string[] ...$args * @return $this */ - public function unsafeParams( /* ... */ ) { - $args = func_get_args(); + public function unsafeParams( ...$args ) { if ( count( $args ) === 1 && is_array( reset( $args ) ) ) { // If only one argument has been passed, and that argument is an array, // treat it as a list of arguments diff --git a/includes/specials/helpers/ImportReporter.php b/includes/specials/helpers/ImportReporter.php index c79e87c36e..80638042b0 100644 --- a/includes/specials/helpers/ImportReporter.php +++ b/includes/specials/helpers/ImportReporter.php @@ -69,10 +69,10 @@ class ImportReporter extends ContextSource { ); } - function reportLogItem( /* ... */ ) { + function reportLogItem( ...$args ) { $this->mLogItemCount++; if ( is_callable( $this->mOriginalLogCallback ) ) { - call_user_func_array( $this->mOriginalLogCallback, func_get_args() ); + call_user_func_array( $this->mOriginalLogCallback, $args ); } } @@ -86,8 +86,7 @@ class ImportReporter extends ContextSource { */ public function reportPage( $title, $foreignTitle, $revisionCount, $successCount, $pageInfo ) { - $args = func_get_args(); - call_user_func_array( $this->mOriginalPageOutCallback, $args ); + call_user_func_array( $this->mOriginalPageOutCallback, func_get_args() ); if ( $title === null ) { # Invalid or non-importable title; a notice is already displayed diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php index de52e7aa21..f17b00c1c8 100644 --- a/maintenance/storage/recompressTracked.php +++ b/maintenance/storage/recompressTracked.php @@ -272,8 +272,7 @@ class RecompressTracked { * Dispatch a command to the next available replica DB. * This may block until a replica DB finishes its work and becomes available. */ - function dispatch( /*...*/ ) { - $args = func_get_args(); + function dispatch( ...$args ) { $pipes = $this->replicaPipes; $x = []; $y = []; diff --git a/tests/phpunit/includes/Storage/NameTableStoreTest.php b/tests/phpunit/includes/Storage/NameTableStoreTest.php index fab49fa582..f42e557b77 100644 --- a/tests/phpunit/includes/Storage/NameTableStoreTest.php +++ b/tests/phpunit/includes/Storage/NameTableStoreTest.php @@ -62,23 +62,23 @@ class NameTableStoreTest extends MediaWikiTestCase { ->getMock(); $mock->expects( $this->exactly( $insertCalls ) ) ->method( 'insert' ) - ->willReturnCallback( function () { - return call_user_func_array( [ $this->db, 'insert' ], func_get_args() ); + ->willReturnCallback( function ( ...$args ) { + return call_user_func_array( [ $this->db, 'insert' ], $args ); } ); $mock->expects( $this->exactly( $selectCalls ) ) ->method( 'select' ) - ->willReturnCallback( function () { - return call_user_func_array( [ $this->db, 'select' ], func_get_args() ); + ->willReturnCallback( function ( ...$args ) { + return call_user_func_array( [ $this->db, 'select' ], $args ); } ); $mock->expects( $this->exactly( $insertCalls ) ) ->method( 'affectedRows' ) - ->willReturnCallback( function () { - return call_user_func_array( [ $this->db, 'affectedRows' ], func_get_args() ); + ->willReturnCallback( function ( ...$args ) { + return call_user_func_array( [ $this->db, 'affectedRows' ], $args ); } ); $mock->expects( $this->any() ) ->method( 'insertId' ) - ->willReturnCallback( function () { - return call_user_func_array( [ $this->db, 'insertId' ], func_get_args() ); + ->willReturnCallback( function ( ...$args ) { + return call_user_func_array( [ $this->db, 'insertId' ], $args ); } ); return $mock; } diff --git a/tests/phpunit/includes/api/query/ApiQueryTestBase.php b/tests/phpunit/includes/api/query/ApiQueryTestBase.php index 08af755d8b..7869bbd2db 100644 --- a/tests/phpunit/includes/api/query/ApiQueryTestBase.php +++ b/tests/phpunit/includes/api/query/ApiQueryTestBase.php @@ -32,14 +32,14 @@ STR; /** * Merges all requests parameter + expected values into one - * @param array $v,... List of arrays, each of which contains exactly two + * @param array ...$arrays List of arrays, each of which contains exactly two * @return array */ - protected function merge( /*...*/ ) { + protected function merge( ...$arrays ) { $request = []; $expected = []; - foreach ( func_get_args() as $v ) { - list( $req, $exp ) = $this->validateRequestExpectedPair( $v ); + foreach ( $arrays as $array ) { + list( $req, $exp ) = $this->validateRequestExpectedPair( $array ); $request = array_merge_recursive( $request, $req ); $this->mergeExpected( $expected, $exp ); } diff --git a/tests/phpunit/includes/auth/UserDataAuthenticationRequestTest.php b/tests/phpunit/includes/auth/UserDataAuthenticationRequestTest.php index cc2771cbfb..fc1930aa56 100644 --- a/tests/phpunit/includes/auth/UserDataAuthenticationRequestTest.php +++ b/tests/phpunit/includes/auth/UserDataAuthenticationRequestTest.php @@ -53,9 +53,8 @@ class UserDataAuthenticationRequestTest extends AuthenticationRequestTestCase { * @dataProvider provideLoadFromSubmission */ public function testLoadFromSubmission( - array $args, array $data, $expectState /* $hiddenPref, $enableEmail */ + array $args, array $data, $expectState, $hiddenPref = null, $enableEmail = null ) { - list( $args, $data, $expectState, $hiddenPref, $enableEmail ) = func_get_args(); $this->setMwGlobals( 'wgHiddenPrefs', $hiddenPref ); $this->setMwGlobals( 'wgEnableEmail', $enableEmail ); parent::testLoadFromSubmission( $args, $data, $expectState ); diff --git a/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php b/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php index ca3ac1b651..7ad654136d 100644 --- a/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php +++ b/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php @@ -39,8 +39,8 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase { */ private static $pageName = 'CategoryMembershipChangeTestPage'; - public static function newForCategorizationCallback() { - self::$lastNotifyArgs = func_get_args(); + public static function newForCategorizationCallback( ...$args ) { + self::$lastNotifyArgs = $args; self::$notifyCallCounter += 1; return self::$mockRecentChange; } diff --git a/tests/phpunit/includes/libs/ArrayUtilsTest.php b/tests/phpunit/includes/libs/ArrayUtilsTest.php index d5ac77bbf7..12b6320564 100644 --- a/tests/phpunit/includes/libs/ArrayUtilsTest.php +++ b/tests/phpunit/includes/libs/ArrayUtilsTest.php @@ -133,9 +133,7 @@ class ArrayUtilsTest extends PHPUnit\Framework\TestCase { * @covers ArrayUtils::arrayDiffAssocRecursive * @dataProvider provideArrayDiffAssocRecursive */ - function testArrayDiffAssocRecursive( $expected ) { - $args = func_get_args(); - array_shift( $args ); + function testArrayDiffAssocRecursive( $expected, ...$args ) { $this->assertEquals( call_user_func_array( 'ArrayUtils::arrayDiffAssocRecursive', $args ), $expected ); diff --git a/tests/phpunit/includes/poolcounter/PoolCounterTest.php b/tests/phpunit/includes/poolcounter/PoolCounterTest.php index 19baf5a82f..28cd503cac 100644 --- a/tests/phpunit/includes/poolcounter/PoolCounterTest.php +++ b/tests/phpunit/includes/poolcounter/PoolCounterTest.php @@ -78,7 +78,7 @@ class PoolCounterTest extends MediaWikiTestCase { // That call will die if the contructor is not public, unless we use disableOriginalConstructor(), // in which case we could not test the constructor. abstract class PoolCounterAbstractMock extends PoolCounter { - public function __construct() { - call_user_func_array( 'parent::__construct', func_get_args() ); + public function __construct( ...$args ) { + call_user_func_array( 'parent::__construct', $args ); } } diff --git a/tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php b/tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php index 16f236770c..63c2b82172 100644 --- a/tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php +++ b/tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php @@ -204,8 +204,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase { } ) ); $mock->expects( $this->any() ) ->method( 'isAllowedAny' ) - ->will( $this->returnCallback( function () use ( $notAllowedAction ) { - $actions = func_get_args(); + ->will( $this->returnCallback( function ( ...$actions ) use ( $notAllowedAction ) { return !in_array( $notAllowedAction, $actions ); } ) ); diff --git a/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php b/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php index a6b2162962..2f95688548 100644 --- a/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php +++ b/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php @@ -89,8 +89,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase { ->getMock(); $mock->expects( $this->any() ) ->method( 'makeKey' ) - ->will( $this->returnCallback( function () { - return implode( ':', func_get_args() ); + ->will( $this->returnCallback( function ( ...$args ) { + return implode( ':', $args ); } ) ); return $mock; } -- 2.20.1