From: X! Date: Mon, 3 Jan 2011 02:10:05 +0000 (+0000) Subject: Move wfCreateObject to MWFunction::newObj. This uses the ReflectionClass to X-Git-Tag: 1.31.0-rc.0~32871 X-Git-Url: https://git.cyclocoop.org/admin/?a=commitdiff_plain;h=1d0ac4a4812c5778c4e0c56f068d7d2b7ed24a46;p=lhc%2Fweb%2Fwiklou.git Move wfCreateObject to MWFunction::newObj. This uses the ReflectionClass to 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. --- diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index d4a816b2f8..6ca9e39586 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -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() { diff --git a/includes/MWFunction.php b/includes/MWFunction.php index 2f79ba575b..b3e79debd9 100644 --- a/includes/MWFunction.php +++ b/includes/MWFunction.php @@ -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); + } } diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index 6f409979fa..39b8ba2866 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -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 { diff --git a/includes/StubObject.php b/includes/StubObject.php index 299bfcef52..391a9f1f41 100644 --- a/includes/StubObject.php +++ b/includes/StubObject.php @@ -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 ); } /** diff --git a/tests/phpunit/includes/MWFunctionTest.php b/tests/phpunit/includes/MWFunctionTest.php index 19eae81e2a..9b32b406a7 100644 --- a/tests/phpunit/includes/MWFunctionTest.php +++ b/tests/phpunit/includes/MWFunctionTest.php @@ -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 { +}