return;
}
+ if ( substr( $filename, 0, 6 ) === 'alias:' ) {
+ // Supported alias formats:
+ // - No deprecation warning: alias:MyNewClassName
+ // - Deprecated in MediaWiki 1.1: alias:MyNewClassName?v=1.1
+ // - Deprecated in MyExtension 1.1: alias:MyNewClassName?c=MyExtension&v=1.1
+ $parts = explode( '?', substr( $filename, 6 ), 2 );
+ $newClassName = $parts[0];
+
+ // If necessary, this will make a recursive call to this function to
+ // load the class using its actual, canonical name.
+ class_alias( $newClassName, $className );
+
+ if ( isset( $parts[1] ) && function_exists( 'wfDeprecated' ) ) {
+ $info = wfCgiToArray( $parts[1] );
+ $function = "name $className for class $newClassName";
+ $version = isset( $info['v'] ) ? $info['v'] : false;
+ $component = isset( $info['c'] ) ? $info['c'] : false;
+
+ // https://github.com/facebook/hhvm/issues/1018
+ $callerOffset = wfIsHHVM() ? 2 : 3;
+ wfDeprecated( $function, $version, $component, $callerOffset );
+ }
+
+ return;
+ }
+
# Make an absolute path, this improves performance by avoiding some stat calls
if ( substr( $filename, 0, 1 ) != '/' && substr( $filename, 1, 1 ) != ':' ) {
global $IP;
'TestAutoloadedLocalClass' => __DIR__ . '/../data/autoloader/TestAutoloadedLocalClass.php',
'TestAutoloadedCamlClass' => __DIR__ . '/../data/autoloader/TestAutoloadedCamlClass.php',
'TestAutoloadedSerializedClass' => __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
+ 'TestAutoloadedAliasedClass' => 'alias:TestAutoloadedAliasedClassNew',
+ 'TestAutoloadedAliasedClassDeprecated' => 'alias:TestAutoloadedAliasedClassNew?v=1.1',
+ 'TestAutoloadedAliasedClassNew' => __DIR__ . '/../data/autoloader/TestAutoloadedAliasedClassNew.php',
);
$this->setMwGlobals( 'wgAutoloadLocalClasses', $this->testLocalClasses + $wgAutoloadLocalClasses );
AutoLoader::resetAutoloadLocalClassesLower();
$expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
$actual = array();
- $files = array_unique( $expected );
+ // Check aliases
+ foreach ( $expected as $class => $file ) {
+ if ( substr( $file, 0, 6 ) !== 'alias:' ) {
+ // Not an alias, so should be an actual file
+ $files[] = $file;
+ } else {
+ $newClass = substr( $file, 6, strcspn( $file, '?', 6 ) );
+ if ( isset( $expected[$newClass] ) ) {
+ if ( substr( $expected[$newClass], 0, 6 ) !== 'alias:' ) {
+ // Alias pointing to an existing MediaWiki class
+ $actual[$class] = $file;
+ }
+ }
+ }
+ }
+
+ $files = array_unique( $files );
foreach ( $files as $file ) {
// Only prefix $IP if it doesn't have it already.
$this->assertFalse( $uncerealized instanceof __PHP_Incomplete_Class,
"unserialize() can load classes case-insensitively." );
}
+
+ function testAliasedClass() {
+ $this->assertSame( 'TestAutoloadedAliasedClassNew',
+ get_class( new TestAutoloadedAliasedClass ) );
+ }
+
+ function testAliasedClassDeprecated() {
+ wfSuppressWarnings();
+ $this->assertSame( 'TestAutoloadedAliasedClassNew',
+ get_class( new TestAutoloadedAliasedClassDeprecated ) );
+ wfRestoreWarnings();
+ }
}