[TASK] Use variable argument-lists instead of func_get_args() 43/45143/5
authorBenni Mack <benni@typo3.org>
Sat, 5 Mar 2016 21:43:05 +0000 (22:43 +0100)
committerAnja Leichsenring <aleichsenring@ab-softlab.de>
Sun, 6 Mar 2016 12:53:25 +0000 (13:53 +0100)
Supported since PHP 5.6. This makes the code easier to read
and allows to properly document using phpdoc.

https://secure.php.net/manual/en/functions.arguments.php#functions.variable-arg-list

Change-Id: Id04f768635eba7c70f1ea5ba6a7c01d00cb9fafc
Resolves: #72071
Releases: master
Reviewed-on: https://review.typo3.org/45143
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
13 files changed:
typo3/sysext/core/Classes/FormProtection/FormProtectionFactory.php
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Tests/BaseTestCase.php
typo3/sysext/core/Tests/Functional/DataHandling/IRRE/AbstractTestCase.php
typo3/sysext/core/Tests/Functional/Framework/Constraint/RequestSection/AbstractRecordConstraint.php
typo3/sysext/core/Tests/Functional/Framework/Frontend/Response.php
typo3/sysext/core/Tests/Unit/Configuration/TypoScript/ConditionMatching/Fixtures/ConditionMatcherUserFuncs.php
typo3/sysext/core/Tests/Unit/Resource/Driver/LocalDriverTest.php
typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/PersistentObjectConverterTest.php
typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
typo3/sysext/frontend/Tests/Unit/Page/PageRepositoryTest.php
typo3/sysext/saltedpasswords/Classes/SaltedPasswordService.php
typo3/sysext/workspaces/Classes/Service/GridDataService.php

index 3388c01..203c98b 100644 (file)
@@ -67,19 +67,20 @@ class FormProtectionFactory
      * @param string $classNameOrType Name of a form protection class, or one
      *                                of the pre-defined form protection types:
      *                                frontend, backend, installtool
+     * @param mixed $constructorArguments Arguments for the class-constructor
      * @return \TYPO3\CMS\Core\FormProtection\AbstractFormProtection the requested instance
      */
-    public static function get($classNameOrType = 'default')
+    public static function get($classNameOrType = 'default', ...$constructorArguments)
     {
         if (isset(self::$instances[$classNameOrType])) {
             return self::$instances[$classNameOrType];
         }
         if ($classNameOrType === 'default' || $classNameOrType === 'installtool' || $classNameOrType === 'frontend' || $classNameOrType === 'backend') {
             $classNameAndConstructorArguments = self::getClassNameAndConstructorArgumentsByType($classNameOrType);
+            self::$instances[$classNameOrType] = self::createInstance(...$classNameAndConstructorArguments);
         } else {
-            $classNameAndConstructorArguments = func_get_args();
+            self::$instances[$classNameOrType] = self::createInstance($classNameOrType, ...$constructorArguments);
         }
-        self::$instances[$classNameOrType] = self::createInstance($classNameAndConstructorArguments);
         return self::$instances[$classNameOrType];
     }
 
@@ -177,17 +178,17 @@ class FormProtectionFactory
      * Creates an instance for the requested class $className
      * and stores it internally.
      *
-     * @param array $classNameAndConstructorArguments
+     * @param array $className
+     * @param mixed $constructorArguments
      * @throws \InvalidArgumentException
      * @return AbstractFormProtection
      */
-    protected static function createInstance(array $classNameAndConstructorArguments)
+    protected static function createInstance($className, ...$constructorArguments)
     {
-        $className = $classNameAndConstructorArguments[0];
         if (!class_exists($className)) {
             throw new \InvalidArgumentException('$className must be the name of an existing class, but ' . 'actually was "' . $className . '".', 1285352962);
         }
-        $instance = call_user_func_array([GeneralUtility::class, 'makeInstance'], $classNameAndConstructorArguments);
+        $instance = GeneralUtility::makeInstance($className, ...$constructorArguments);
         if (!$instance instanceof AbstractFormProtection) {
             throw new \InvalidArgumentException('$className must be a subclass of ' . AbstractFormProtection::class . ', but actually was "' . $className . '".', 1285353026);
         }
index 23a4b7d..c0b6bcd 100755 (executable)
@@ -3982,12 +3982,11 @@ class GeneralUtility
      * the instance of a specific class.
      *
      * @param string $className name of the class to instantiate, must not be empty and not start with a backslash
-     *
+     * @param mixed $constructorArguments Arguments for the constructor
      * @return object the created instance
-     *
      * @throws \InvalidArgumentException if $className is empty or starts with a backslash
      */
-    public static function makeInstance($className)
+    public static function makeInstance($className, ...$constructorArguments)
     {
         if (!is_string($className) || empty($className)) {
             throw new \InvalidArgumentException('$className must be a non empty string.', 1288965219);
@@ -4016,7 +4015,7 @@ class GeneralUtility
             return array_shift(self::$nonSingletonInstances[$finalClassName]);
         }
         // Create new instance and call constructor with parameters
-        $instance = static::instantiateClass($finalClassName, func_get_args());
+        $instance = new $finalClassName(...$constructorArguments);
         // Register new singleton instance
         if ($instance instanceof SingletonInterface) {
             self::$singletonInstances[$finalClassName] = $instance;
@@ -4025,54 +4024,6 @@ class GeneralUtility
     }
 
     /**
-     * Speed optimized alternative to ReflectionClass::newInstanceArgs()
-     *
-     * @param string $className Name of the class to instantiate
-     * @param array $arguments Arguments passed to self::makeInstance() thus the first one with index 0 holds the requested class name
-     * @return mixed
-     */
-    protected static function instantiateClass($className, $arguments)
-    {
-        switch (count($arguments)) {
-            case 1:
-                $instance = new $className();
-                break;
-            case 2:
-                $instance = new $className($arguments[1]);
-                break;
-            case 3:
-                $instance = new $className($arguments[1], $arguments[2]);
-                break;
-            case 4:
-                $instance = new $className($arguments[1], $arguments[2], $arguments[3]);
-                break;
-            case 5:
-                $instance = new $className($arguments[1], $arguments[2], $arguments[3], $arguments[4]);
-                break;
-            case 6:
-                $instance = new $className($arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5]);
-                break;
-            case 7:
-                $instance = new $className($arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5], $arguments[6]);
-                break;
-            case 8:
-                $instance = new $className($arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5], $arguments[6], $arguments[7]);
-                break;
-            case 9:
-                $instance = new $className($arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5], $arguments[6], $arguments[7], $arguments[8]);
-                break;
-            default:
-                // The default case for classes with constructors that have more than 8 arguments.
-                // This will fail when one of the arguments shall be passed by reference.
-                // In case we really need to support this edge case, we can implement the solution from here: https://review.typo3.org/26344
-                $class = new \ReflectionClass($className);
-                array_shift($arguments);
-                $instance = $class->newInstanceArgs($arguments);
-        }
-        return $instance;
-    }
-
-    /**
      * Returns the class name for a new instance, taking into account
      * registered implementations for this class
      *
index e7e1d09..65b36de 100644 (file)
@@ -225,14 +225,11 @@ abstract class BaseTestCase extends \PHPUnit_Framework_TestCase
      *
      * @param object $object The object to be invoked
      * @param string $name the name of the method to call
+     * @param mixed $arguments
      * @return mixed
      */
-    protected function callInaccessibleMethod($object, $name)
+    protected function callInaccessibleMethod($object, $name, ...$arguments)
     {
-        // Remove first two arguments ($object and $name)
-        $arguments = func_get_args();
-        array_splice($arguments, 0, 2);
-
         $reflectionObject = new \ReflectionObject($object);
         $reflectionMethod = $reflectionObject->getMethod($name);
         $reflectionMethod->setAccessible(true);
index 54e5240..e22e347 100644 (file)
@@ -440,14 +440,6 @@ abstract class AbstractTestCase extends \TYPO3\CMS\Core\Tests\FunctionalTestCase
     }
 
     /**
-     * @return string
-     */
-    protected function combine()
-    {
-        return implode(':', func_get_args());
-    }
-
-    /**
      * @return \TYPO3\CMS\Core\Authentication\BackendUserAuthentication
      */
     protected function getBackendUser()
index d1c808c..35ac720 100644 (file)
@@ -58,9 +58,8 @@ abstract class AbstractRecordConstraint extends \PHPUnit_Framework_Constraint
         return $this;
     }
 
-    public function setValues()
+    public function setValues(...$values)
     {
-        $values = func_get_args();
         $this->values = $values;
         return $this;
     }
index 7e62bf8..399cbb6 100644 (file)
@@ -90,14 +90,13 @@ class Response
     }
 
     /**
+     * @param mixed $sectionIdentifiers
      * @return NULL|array|ResponseSection[]
      */
-    public function getResponseSections()
+    public function getResponseSections(...$sectionIdentifiers)
     {
-        $sectionIdentifiers = func_get_args();
-
         if (empty($sectionIdentifiers)) {
-            $sectionIdentifiers = array('Default');
+            $sectionIdentifiers = ['Default'];
         }
 
         $sections = array();
index 174ec34..a924f7a 100644 (file)
@@ -20,18 +20,18 @@ namespace {
 
     function user_testFunctionWithSingleArgument()
     {
-        return count(func_get_args()) === 1;
+        return func_num_args() === 1;
     }
 
     function user_testFunctionWithThreeArguments()
     {
-        return count(func_get_args()) === 3;
+        return func_num_args() === 3;
     }
 
-    function user_testFunctionWithThreeArgumentsSpaces()
+    function user_testFunctionWithThreeArgumentsSpaces(...$arguments)
     {
         $result = true;
-        foreach (func_get_args() as $argument) {
+        foreach ($arguments as $argument) {
             $result &= (trim($argument) == $argument);
         }
         return $result;
index 2fceb28..904a693 100644 (file)
@@ -753,12 +753,12 @@ class LocalDriverTest extends \TYPO3\CMS\Core\Tests\Unit\Resource\BaseTestCase
      * As it is static we are using an exception to test if it is really called and works
      *
      * @static
+     * @param string $itemName
      * @throws \InvalidArgumentException
      * @see getFileListCallsConfiguredCallbackFunction
      */
-    public static function callbackStaticTestFunction()
+    public static function callbackStaticTestFunction($itemName)
     {
-        list($itemName) = func_get_args();
         if ($itemName === 'file2') {
             throw new \InvalidArgumentException('$itemName', 1336159604);
         }
index f35e021..d4a3c5f 100644 (file)
@@ -73,13 +73,12 @@ class PersistentObjectConverterTest extends UnitTestCase
         $this->mockObjectManager = $this->getMock(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface::class);
         $this->mockObjectManager->expects($this->any())
             ->method('get')
-            ->will($this->returnCallback(function () {
-                    $args = func_get_args();
-                    $reflectionClass = new \ReflectionClass(array_shift($args));
-                    if (empty($args)) {
+            ->will($this->returnCallback(function ($className, ...$arguments) {
+                    $reflectionClass = new \ReflectionClass($className);
+                    if (empty($arguments)) {
                         return $reflectionClass->newInstance();
                     } else {
-                        return $reflectionClass->newInstanceArgs($args);
+                        return $reflectionClass->newInstanceArgs($arguments);
                     }
                 }));
         $this->inject($this->converter, 'objectManager', $this->mockObjectManager);
index ba46e80..c7ce105 100755 (executable)
@@ -183,12 +183,15 @@ class ContentObjectRendererTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
     /**
      * Handles the arguments that have been sent to the getImgResource hook.
      *
-     * @return         array
+     * @param string $file
+     * @param array $fileArray
+     * @param $imageResource
+     * @param \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $parent
+     * @return array
      * @see getImgResourceHookGetsCalled
      */
-    public function isGetImgResourceHookCalledCallback()
+    public function isGetImgResourceHookCalledCallback($file, $fileArray, $imageResource, $parent)
     {
-        list($file, $fileArray, $imageResource, $parent) = func_get_args();
         $this->assertEquals('typo3/clear.gif', $file);
         $this->assertEquals('typo3/clear.gif', $imageResource['origFile']);
         $this->assertTrue(is_array($fileArray));
@@ -3550,12 +3553,15 @@ class ContentObjectRendererTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
     /**
      * Handles the arguments that have been sent to the getImgResource hook.
      *
-     * @return         string
+     * @param array $sourceRenderConfiguration
+     * @param array $sourceConfiguration
+     * @param $oneSourceCollection
+     * @param $parent
+     * @return string
      * @see getImageSourceCollectionHookCalled
      */
-    public function isGetOneSourceCollectionCalledCallback()
+    public function isGetOneSourceCollectionCalledCallback($sourceRenderConfiguration, $sourceConfiguration, $oneSourceCollection, $parent)
     {
-        list($sourceRenderConfiguration, $sourceConfiguration, $oneSourceCollection, $parent) = func_get_args();
         $this->assertTrue(is_array($sourceRenderConfiguration));
         $this->assertTrue(is_array($sourceConfiguration));
         return 'isGetOneSourceCollectionCalledCallback';
index 8c623a2..0811c52 100644 (file)
@@ -73,10 +73,13 @@ class PageRepositoryTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
 
     /**
      * Handles the arguments that have been sent to the getPage_preProcess hook
+     *
+     * @param int $uid
+     * @param $disableGroupAccessCheck
+     * @param \TYPO3\CMS\Frontend\Page\PageRepository $parent
      */
-    public function isGetPagePreProcessCalledCallback()
+    public function isGetPagePreProcessCalledCallback($uid, $disableGroupAccessCheck, $parent)
     {
-        list($uid, $disableGroupAccessCheck, $parent) = func_get_args();
         $this->assertEquals(42, $uid);
         $this->assertFalse($disableGroupAccessCheck);
         $this->assertTrue($parent instanceof \TYPO3\CMS\Frontend\Page\PageRepository);
index d3ec11e..9accafe 100644 (file)
@@ -238,14 +238,13 @@ class SaltedPasswordService extends \TYPO3\CMS\Sv\AbstractAuthenticationService
      * parameters. The syntax is the same as for sprintf()
      *
      * @param string $message Message to output
+     * @param string $params
      * @return void
      * @see \TYPO3\CMS\Core\Utility\GeneralUtility::sysLog()
      */
-    public function writeLogMessage($message)
+    public function writeLogMessage($message, ...$params)
     {
-        if (func_num_args() > 1) {
-            $params = func_get_args();
-            array_shift($params);
+        if (!empty($params)) {
             $message = vsprintf($message, $params);
         }
         if (TYPO3_MODE === 'BE') {
index 16c0677..c064618 100644 (file)
@@ -619,12 +619,14 @@ class GridDataService
      * Emits a signal to be handled by any registered slots.
      *
      * @param string $signalName Name of the signal
+     * @param mixed $arguments
      * @return array
      */
-    protected function emitSignal($signalName)
+    protected function emitSignal($signalName, ...$arguments)
     {
         // Arguments are always ($this, [method argument], [method argument], ...)
-        $signalArguments = array_merge(array($this), array_slice(func_get_args(), 1));
+        $signalArguments = $arguments
+        array_unshift($signalArguments, $this);
         $slotReturn = $this->getSignalSlotDispatcher()->dispatch(\TYPO3\CMS\Workspaces\Service\GridDataService::class, $signalName, $signalArguments);
         return array_slice($slotReturn, 1);
     }