Move wfCreateObject to MWFunction::newObj. This uses the ReflectionClass to
authorX! <soxred93@users.mediawiki.org>
Mon, 3 Jan 2011 02:10:05 +0000 (02:10 +0000)
committerX! <soxred93@users.mediawiki.org>
Mon, 3 Jan 2011 02:10:05 +0000 (02:10 +0000)
instantiate a variable-length constructor in php 5.1.3 and up, and falls
back to the old, ugly, manual method that was in the old wfCreateObject
function. The instances in the core have been replaced.

includes/GlobalFunctions.php
includes/MWFunction.php
includes/SpecialPage.php
includes/StubObject.php
tests/phpunit/includes/MWFunctionTest.php

index d4a816b..6ca9e39 100644 (file)
@@ -2842,27 +2842,10 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
  * Create an object with a given name and an array of construct parameters
  * @param $name String
  * @param $p Array: parameters
+ * @deprecated
  */
 function wfCreateObject( $name, $p ) {
-       $p = array_values( $p );
-       switch ( count( $p ) ) {
-               case 0:
-                       return new $name;
-               case 1:
-                       return new $name( $p[0] );
-               case 2:
-                       return new $name( $p[0], $p[1] );
-               case 3:
-                       return new $name( $p[0], $p[1], $p[2] );
-               case 4:
-                       return new $name( $p[0], $p[1], $p[2], $p[3] );
-               case 5:
-                       return new $name( $p[0], $p[1], $p[2], $p[3], $p[4] );
-               case 6:
-                       return new $name( $p[0], $p[1], $p[2], $p[3], $p[4], $p[5] );
-               default:
-                       throw new MWException( 'Too many arguments to construtor in wfCreateObject' );
-       }
+       return MWFunction::newObj( $name, $p );
 }
 
 function wfHttpOnlySafe() {
index 2f79ba5..b3e79de 100644 (file)
@@ -42,10 +42,91 @@ class MWFunction {
                
        }
        
-       public static function callArray( $callback, $params ) {
+       public static function callArray( $callback, $argsarams ) {
        
                $callback = self::cleanCallback( $callback );
-               return call_user_func_array( $callback, $params );
+               return call_user_func_array( $callback, $argsarams );
+               
+       }
+       
+       public static function newObj( $class, $args = array(), $force_fallback = false ) {
+               if( !count( $args ) ) {
+                       return new $class;
+               }
+               
+               if ( version_compare( PHP_VERSION, '5.1.3', '<' ) || $force_fallback ) {
+               
+                       //If only MW needed 5.1.3 and up... sigh
+                       
+                       $args = array_values( $args );
+                       switch ( count( $args ) ) {
+                               case 0:
+                                       return new $class;
+                               case 1:
+                                       return new $class( $args[0] );
+                               case 2:
+                                       return new $class( $args[0], $args[1] );
+                               case 3:
+                                       return new $class( $args[0], $args[1], $args[2] );
+                               case 4:
+                                       return new $class( $args[0], $args[1], $args[2], $args[3] );
+                               case 5:
+                                       return new $class( $args[0], $args[1], $args[2], $args[3], $args[4] );
+                               case 6:
+                                       return new $class( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5] );
+                               case 7:
+                                       return new $class( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6] );
+                               case 8:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7] 
+                                       );
+                               case 9:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8] 
+                                       );
+                               case 10:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8], $args[9]
+                                       );
+                               case 11:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8], $args[9], $args[10] 
+                                       );
+                               case 12:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8], $args[9], $args[10], $args[11] 
+                                       );
+                               case 13:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8], $args[9], $args[10], $args[11], $args[12]
+                                       );
+                               case 14:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8], $args[9], $args[10], $args[11], $args[12], $args[13]
+                                       );
+                               case 15:
+                                       return new $class( 
+                                               $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], 
+                                               $args[7], $args[8], $args[9], $args[10], $args[11], $args[12], $args[13], 
+                                               $args[14]
+                                       );
+                               default:
+                                       throw new MWException( 'Too many arguments to construtor in MWFunction::newObj' );
+                       }
+               }
+       
+               else {
+       
+                       $ref = new ReflectionClass($class); 
+                       return $ref->newInstanceArgs($args);
+               }
                
        }
        
index 6f40997..39b8ba2 100644 (file)
@@ -407,7 +407,7 @@ class SpecialPage {
                                self::$mList[$name] = new $className;
                        } elseif ( is_array( $rec ) ) {
                                $className = array_shift( $rec );
-                               self::$mList[$name] = wfCreateObject( $className, $rec );
+                               self::$mList[$name] = MWFunction::newObj( $className, $rec );
                        }
                        return self::$mList[$name];
                } else {
index 299bfce..391a9f1 100644 (file)
@@ -62,7 +62,7 @@ class StubObject {
         * Create a new object to replace this stub object.
         */
        function _newObject() {
-               return wfCreateObject( $this->mClass, $this->mParams );
+               return MWFunction::newObj( $this->mClass, $this->mParams );
        }
 
        /**
index 19eae81..9b32b40 100644 (file)
@@ -5,23 +5,47 @@ class MWFunctionTest extends MediaWikiTestCase {
        function testCallUserFuncWorkarounds() {
                
                $this->assertEquals( 
-                       MWFunction::call( 'MWFunctionTest::someMethod' ), 
-                       call_user_func( array( 'MWFunctionTest', 'someMethod' ) )
+                       call_user_func( array( 'MWFunctionTest', 'someMethod' ) ),
+                       MWFunction::call( 'MWFunctionTest::someMethod' )
                );
                $this->assertEquals( 
-                       MWFunction::call( 'MWFunctionTest::someMethod', 'foo', 'bar', 'baz' ), 
-                       call_user_func( array( 'MWFunctionTest', 'someMethod' ), 'foo', 'bar', 'baz' )
+                       call_user_func( array( 'MWFunctionTest', 'someMethod' ), 'foo', 'bar', 'baz' ),
+                       MWFunction::call( 'MWFunctionTest::someMethod', 'foo', 'bar', 'baz' )
                );
                
                
                
                $this->assertEquals( 
-                       MWFunction::callArray( 'MWFunctionTest::someMethod', array() ), 
-                       call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array() )
+                       call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array() ),
+                       MWFunction::callArray( 'MWFunctionTest::someMethod', array() )
                );
                $this->assertEquals( 
-                       MWFunction::callArray( 'MWFunctionTest::someMethod', array( 'foo', 'bar', 'baz' ) ), 
-                       call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array( 'foo', 'bar', 'baz' ) )
+                       call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array( 'foo', 'bar', 'baz' ) ),
+                       MWFunction::callArray( 'MWFunctionTest::someMethod', array( 'foo', 'bar', 'baz' ) )
+               );
+               
+       }
+       
+       function testNewObjFunction() {
+               
+               $arg1 = 'Foo';
+               $arg2 = 'Bar';
+               $arg3 = array( 'Baz' );
+               $arg4 = new ExampleObject;
+               
+               $args = array( $arg1, $arg2, $arg3, $arg4 );
+               
+               $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
+               
+               $this->assertEquals( 
+                       MWFunction::newObj( 'MWBlankClass', $args )->args, 
+                       $newObject->args
+               );
+               
+               $this->assertEquals( 
+                       MWFunction::newObj( 'MWBlankClass', $args, true )->args, 
+                       $newObject->args,
+                       'Works even with PHP version < 5.1.3'
                );
                
        }
@@ -32,3 +56,15 @@ class MWFunctionTest extends MediaWikiTestCase {
        
 }
 
+class MWBlankClass {
+       
+       public $args = array();
+       
+       function __construct( $arg1, $arg2, $arg3, $arg4 ) {
+               $this->args = array( $arg1, $arg2, $arg3, $arg4 );
+       }
+       
+}
+
+class ExampleObject {
+}