]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blobdiff - includes/AutoLoader.php
MediaWiki 1.30.2-scripts
[autoinstalls/mediawiki.git] / includes / AutoLoader.php
index 25c728cdd8f24060322d727b178473524d83a5ae..8dc7d4094a0b983237996173637c9bff89a61bd7 100644 (file)
 <?php
+/**
+ * This defines autoloading handler for whole MediaWiki framework
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
-/* This defines autoloading handler for whole MediaWiki framework */
+/**
+ * Locations of core classes
+ * Extension classes are specified with $wgAutoloadClasses
+ * This array is a global instead of a static member of AutoLoader to work around a bug in APC
+ */
+require_once __DIR__ . '/../autoload.php';
 
-ini_set('unserialize_callback_func', '__autoload' );
+class AutoLoader {
+       static protected $autoloadLocalClassesLower = null;
 
-function __autoload($className) {
-       global $wgAutoloadClasses;
+       /**
+        * autoload - take a class name and attempt to load it
+        *
+        * @param string $className Name of class we're looking for.
+        */
+       static function autoload( $className ) {
+               global $wgAutoloadClasses, $wgAutoloadLocalClasses,
+                       $wgAutoloadAttemptLowercase;
 
-       static $localClasses = array(
-               # Includes
-               'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
-               'AjaxCachePolicy' => 'includes/AjaxFunctions.php',
-               'AjaxResponse' => 'includes/AjaxResponse.php',
-               'AlphabeticPager' => 'includes/Pager.php',
-               'Article' => 'includes/Article.php',
-               'AuthPlugin' => 'includes/AuthPlugin.php',
-               'BagOStuff' => 'includes/BagOStuff.php',
-               'HashBagOStuff' => 'includes/BagOStuff.php',
-               'SqlBagOStuff' => 'includes/BagOStuff.php',
-               'MediaWikiBagOStuff' => 'includes/BagOStuff.php',
-               'TurckBagOStuff' => 'includes/BagOStuff.php',
-               'APCBagOStuff' => 'includes/BagOStuff.php',
-               'eAccelBagOStuff' => 'includes/BagOStuff.php',
-               'XCacheBagOStuff' => 'includes/BagOStuff.php',
-               'DBABagOStuff' => 'includes/BagOStuff.php',
-               'Block' => 'includes/Block.php',
-               'HTMLFileCache' => 'includes/HTMLFileCache.php',
-               'DependencyWrapper' => 'includes/CacheDependency.php',
-               'FileDependency' => 'includes/CacheDependency.php',
-               'TitleDependency' => 'includes/CacheDependency.php',
-               'TitleListDependency' => 'includes/CacheDependency.php',
-               'CategoryPage' => 'includes/CategoryPage.php',
-               'CategoryViewer' => 'includes/CategoryPage.php',
-               'Categoryfinder' => 'includes/Categoryfinder.php',
-               'RCCacheEntry' => 'includes/ChangesList.php',
-               'ChangesList' => 'includes/ChangesList.php',
-               'OldChangesList' => 'includes/ChangesList.php',
-               'EnhancedChangesList' => 'includes/ChangesList.php',
-               'CoreParserFunctions' => 'includes/CoreParserFunctions.php',
-               'DBObject' => 'includes/Database.php',
-               'Database' => 'includes/Database.php',
-               'DatabaseMysql' => 'includes/Database.php',
-               'ResultWrapper' => 'includes/Database.php',
-               'DatabasePostgres' => 'includes/DatabasePostgres.php',
-               'DatabaseOracle' => 'includes/DatabaseOracle.php',
-               'DateFormatter' => 'includes/DateFormatter.php',
-               'DifferenceEngine' => 'includes/DifferenceEngine.php',
-               '_DiffOp' => 'includes/DifferenceEngine.php',
-               '_DiffOp_Copy' => 'includes/DifferenceEngine.php',
-               '_DiffOp_Delete' => 'includes/DifferenceEngine.php',
-               '_DiffOp_Add' => 'includes/DifferenceEngine.php',
-               '_DiffOp_Change' => 'includes/DifferenceEngine.php',
-               '_DiffEngine' => 'includes/DifferenceEngine.php',
-               'Diff' => 'includes/DifferenceEngine.php',
-               'MappedDiff' => 'includes/DifferenceEngine.php',
-               'DiffFormatter' => 'includes/DifferenceEngine.php',
-               'DjVuImage' => 'includes/DjVuImage.php',
-               '_HWLDF_WordAccumulator' => 'includes/DifferenceEngine.php',
-               'WordLevelDiff' => 'includes/DifferenceEngine.php',
-               'TableDiffFormatter' => 'includes/DifferenceEngine.php',
-               'EditPage' => 'includes/EditPage.php',
-               'MWException' => 'includes/Exception.php',
-               'Exif' => 'includes/Exif.php',
-               'FormatExif' => 'includes/Exif.php',
-               'WikiExporter' => 'includes/Export.php',
-               'XmlDumpWriter' => 'includes/Export.php',
-               'DumpOutput' => 'includes/Export.php',
-               'DumpFileOutput' => 'includes/Export.php',
-               'DumpPipeOutput' => 'includes/Export.php',
-               'DumpGZipOutput' => 'includes/Export.php',
-               'DumpBZip2Output' => 'includes/Export.php',
-               'Dump7ZipOutput' => 'includes/Export.php',
-               'DumpFilter' => 'includes/Export.php',
-               'DumpNotalkFilter' => 'includes/Export.php',
-               'DumpNamespaceFilter' => 'includes/Export.php',
-               'DumpLatestFilter' => 'includes/Export.php',
-               'DumpMultiWriter' => 'includes/Export.php',
-               'ExternalEdit' => 'includes/ExternalEdit.php',
-               'ExternalStore' => 'includes/ExternalStore.php',
-               'ExternalStoreDB' => 'includes/ExternalStoreDB.php',
-               'ExternalStoreHttp' => 'includes/ExternalStoreHttp.php',
-               'FakeTitle' => 'includes/FakeTitle.php',
-               'FeedItem' => 'includes/Feed.php',
-               'ChannelFeed' => 'includes/Feed.php',
-               'RSSFeed' => 'includes/Feed.php',
-               'AtomFeed' => 'includes/Feed.php',
-               'FileStore' => 'includes/FileStore.php',
-               'FSException' => 'includes/FileStore.php',
-               'FSTransaction' => 'includes/FileStore.php',
-               'HTMLForm' => 'includes/HTMLForm.php',
-               'HistoryBlob' => 'includes/HistoryBlob.php',
-               'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
-               'HistoryBlobStub' => 'includes/HistoryBlob.php',
-               'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
-               'HTMLCacheUpdate' => 'includes/HTMLCacheUpdate.php',
-               'Http' => 'includes/HttpFunctions.php',
-               'IP' => 'includes/IP.php',
-               'ThumbnailImage' => 'includes/Image.php',
-               'ImageGallery' => 'includes/ImageGallery.php',
-               'ImagePage' => 'includes/ImagePage.php',
-               'ImageHistoryList' => 'includes/ImagePage.php',
-               'ImageRemote' => 'includes/ImageRemote.php',
-               'FileDeleteForm' => 'includes/FileDeleteForm.php',
-               'FileRevertForm' => 'includes/FileRevertForm.php',
-               'Job' => 'includes/JobQueue.php',
-               'EmaillingJob' => 'includes/EmaillingJob.php',
-               'EnotifNotifyJob' => 'includes/EnotifNotifyJob.php',
-               'HTMLCacheUpdateJob' => 'includes/HTMLCacheUpdate.php',
-               'RefreshLinksJob' => 'includes/RefreshLinksJob.php',
-               'Licenses' => 'includes/Licenses.php',
-               'License' => 'includes/Licenses.php',
-               'LinkBatch' => 'includes/LinkBatch.php',
-               'LinkCache' => 'includes/LinkCache.php',
-               'LinkFilter' => 'includes/LinkFilter.php',
-               'Linker' => 'includes/Linker.php',
-               'LinksUpdate' => 'includes/LinksUpdate.php',
-               'LoadBalancer' => 'includes/LoadBalancer.php',
-               'LogPage' => 'includes/LogPage.php',
-               'MacBinary' => 'includes/MacBinary.php',
-               'MagicWord' => 'includes/MagicWord.php',
-               'MagicWordArray' => 'includes/MagicWord.php',
-               'MathRenderer' => 'includes/Math.php',
-               'MediaTransformOutput' => 'includes/MediaTransformOutput.php',
-               'ThumbnailImage' => 'includes/MediaTransformOutput.php',
-               'MediaTransformError' => 'includes/MediaTransformOutput.php',
-               'TransformParameterError' => 'includes/MediaTransformOutput.php',
-               'MessageCache' => 'includes/MessageCache.php',
-               'MimeMagic' => 'includes/MimeMagic.php',
-               'Namespace' => 'includes/Namespace.php',
-               'FakeMemCachedClient' => 'includes/ObjectCache.php',
-               'OutputPage' => 'includes/OutputPage.php',
-               'PageHistory' => 'includes/PageHistory.php',
-               'IndexPager' => 'includes/Pager.php',
-               'ReverseChronologicalPager' => 'includes/Pager.php',
-               'TablePager' => 'includes/Pager.php',
-               'Parser' => 'includes/Parser.php',
-               'ParserOutput' => 'includes/ParserOutput.php',
-               'ParserOptions' => 'includes/ParserOptions.php',
-               'ParserCache' => 'includes/ParserCache.php',
-               'PatrolLog' => 'includes/PatrolLog.php',
-               'ProfilerSimple' => 'includes/ProfilerSimple.php',
-               'ProfilerSimpleUDP' => 'includes/ProfilerSimpleUDP.php',
-               'Profiler' => 'includes/Profiler.php',
-               'ProxyTools' => 'includes/ProxyTools.php',
-               'ProtectionForm' => 'includes/ProtectionForm.php',
-               'QueryPage' => 'includes/QueryPage.php',
-               'PageQueryPage' => 'includes/PageQueryPage.php',
-               'ImageQueryPage' => 'includes/ImageQueryPage.php',
-               'RawPage' => 'includes/RawPage.php',
-               'RecentChange' => 'includes/RecentChange.php',
-               'Revision' => 'includes/Revision.php',
-               'Sanitizer' => 'includes/Sanitizer.php',
-               'SearchEngine' => 'includes/SearchEngine.php',
-               'SearchResultSet' => 'includes/SearchEngine.php',
-               'SearchResult' => 'includes/SearchEngine.php',
-               'SearchEngineDummy' => 'includes/SearchEngine.php',
-               'SearchMySQL' => 'includes/SearchMySQL.php',
-               'MySQLSearchResultSet' => 'includes/SearchMySQL.php',
-               'SearchMySQL4' => 'includes/SearchMySQL4.php',
-               'SearchPostgres' => 'includes/SearchPostgres.php',
-               'SearchUpdate' => 'includes/SearchUpdate.php',
-               'SearchUpdateMyISAM' => 'includes/SearchUpdate.php',
-               'SearchOracle' => 'includes/SearchOracle.php',
-               'SiteConfiguration' => 'includes/SiteConfiguration.php',
-               'SiteStats' => 'includes/SiteStats.php',
-               'SiteStatsUpdate' => 'includes/SiteStats.php',
-               'Skin' => 'includes/Skin.php',
-               'MediaWiki_I18N' => 'includes/SkinTemplate.php',
-               'SkinTemplate' => 'includes/SkinTemplate.php',
-               'QuickTemplate' => 'includes/SkinTemplate.php',
-               'SpecialAllpages' => 'includes/SpecialAllpages.php',
-               'AncientPagesPage' => 'includes/SpecialAncientpages.php',
-               'IPBlockForm' => 'includes/SpecialBlockip.php',
-               'SpecialBookSources' => 'includes/SpecialBooksources.php',
-               'BrokenRedirectsPage' => 'includes/SpecialBrokenRedirects.php',
-               'EmailConfirmation' => 'includes/SpecialConfirmemail.php',
-               'ContributionsPage' => 'includes/SpecialContributions.php',
-               'DeadendPagesPage' => 'includes/SpecialDeadendpages.php',
-               'DisambiguationsPage' => 'includes/SpecialDisambiguations.php',
-               'DoubleRedirectsPage' => 'includes/SpecialDoubleRedirects.php',
-               'EmailUserForm' => 'includes/SpecialEmailuser.php',
-               'WikiRevision' => 'includes/SpecialImport.php',
-               'WikiImporter' => 'includes/SpecialImport.php',
-               'ImportStringSource' => 'includes/SpecialImport.php',
-               'ImportStreamSource' => 'includes/SpecialImport.php',
-               'IPUnblockForm' => 'includes/SpecialIpblocklist.php',
-               'ListredirectsPage' => 'includes/SpecialListredirects.php',
-               'DBLockForm' => 'includes/SpecialLockdb.php',
-               'LogReader' => 'includes/SpecialLog.php',
-               'LogViewer' => 'includes/SpecialLog.php',
-               'LonelyPagesPage' => 'includes/SpecialLonelypages.php',
-               'LongPagesPage' => 'includes/SpecialLongpages.php',
-               'MIMEsearchPage' => 'includes/SpecialMIMEsearch.php',
-               'MostcategoriesPage' => 'includes/SpecialMostcategories.php',
-               'MostimagesPage' => 'includes/SpecialMostimages.php',
-               'MostlinkedPage' => 'includes/SpecialMostlinked.php',
-               'MostlinkedCategoriesPage' => 'includes/SpecialMostlinkedcategories.php',
-               'SpecialMostlinkedtemplates' => 'includes/SpecialMostlinkedtemplates.php',
-               'MostrevisionsPage' => 'includes/SpecialMostrevisions.php',
-               'FewestrevisionsPage' => 'includes/SpecialFewestrevisions.php',
-               'MovePageForm' => 'includes/SpecialMovepage.php',
-               'NewbieContributionsPage' => 'includes/SpecialNewbieContributions.php',
-               'NewPagesPage' => 'includes/SpecialNewpages.php',
-               'SpecialPage' => 'includes/SpecialPage.php',
-               'UnlistedSpecialPage' => 'includes/SpecialPage.php',
-               'IncludableSpecialPage' => 'includes/SpecialPage.php',
-               'PopularPagesPage' => 'includes/SpecialPopularpages.php',
-               'PreferencesForm' => 'includes/SpecialPreferences.php',
-               'SpecialPrefixindex' => 'includes/SpecialPrefixindex.php',
-               'PasswordResetForm' => 'includes/SpecialResetpass.php',
-               'RevisionDeleteForm' => 'includes/SpecialRevisiondelete.php',
-               'RevisionDeleter' => 'includes/SpecialRevisiondelete.php',
-               'SpecialSearch' => 'includes/SpecialSearch.php',
-               'ShortPagesPage' => 'includes/SpecialShortpages.php',
-               'UncategorizedCategoriesPage' => 'includes/SpecialUncategorizedcategories.php',
-               'UncategorizedPagesPage' => 'includes/SpecialUncategorizedpages.php',
-               'UncategorizedTemplatesPage' => 'includes/SpecialUncategorizedtemplates.php',
-               'PageArchive' => 'includes/SpecialUndelete.php',
-               'UndeleteForm' => 'includes/SpecialUndelete.php',
-               'DBUnlockForm' => 'includes/SpecialUnlockdb.php',
-               'UnusedCategoriesPage' => 'includes/SpecialUnusedcategories.php',
-               'UnusedimagesPage' => 'includes/SpecialUnusedimages.php',
-               'UnusedtemplatesPage' => 'includes/SpecialUnusedtemplates.php',
-               'UnwatchedpagesPage' => 'includes/SpecialUnwatchedpages.php',
-               'UploadForm' => 'includes/SpecialUpload.php',
-               'UploadFormMogile' => 'includes/SpecialUploadMogile.php',
-               'LoginForm' => 'includes/SpecialUserlogin.php',
-               'UserrightsForm' => 'includes/SpecialUserrights.php',
-               'SpecialVersion' => 'includes/SpecialVersion.php',
-               'WantedCategoriesPage' => 'includes/SpecialWantedcategories.php',
-               'WantedPagesPage' => 'includes/SpecialWantedpages.php',
-               'WhatLinksHerePage' => 'includes/SpecialWhatlinkshere.php',
-               'WithoutInterwikiPage' => 'includes/SpecialWithoutinterwiki.php',
-               'SquidUpdate' => 'includes/SquidUpdate.php',
-               'ReplacementArray' => 'includes/StringUtils.php',
-               'Replacer' => 'includes/StringUtils.php',
-               'RegexlikeReplacer' => 'includes/StringUtils.php',
-               'DoubleReplacer' => 'includes/StringUtils.php',
-               'HashtableReplacer' => 'includes/StringUtils.php',
-               'StringUtils' => 'includes/StringUtils.php',
-               'Title' => 'includes/Title.php',
-               'User' => 'includes/User.php',
-               'MailAddress' => 'includes/UserMailer.php',
-               'EmailNotification' => 'includes/UserMailer.php',
-               'WatchedItem' => 'includes/WatchedItem.php',
-               'WebRequest' => 'includes/WebRequest.php',
-               'WebResponse' => 'includes/WebResponse.php',
-               'FauxRequest' => 'includes/WebRequest.php',
-               'MediaWiki' => 'includes/Wiki.php',
-               'WikiError' => 'includes/WikiError.php',
-               'WikiErrorMsg' => 'includes/WikiError.php',
-               'WikiXmlError' => 'includes/WikiError.php',
-               'Xml' => 'includes/Xml.php',
-               'ZhClient' => 'includes/ZhClient.php',
-               'memcached' => 'includes/memcached-client.php',
-               'EmaillingJob' => 'includes/JobQueue.php',
-               'WatchlistEditor' => 'includes/WatchlistEditor.php',
-
-               # filerepo
-               'ArchivedFile' => 'includes/filerepo/ArchivedFile.php',
-               'File' => 'includes/filerepo/File.php',
-               'FileRepo' => 'includes/filerepo/FileRepo.php',
-               'FileRepoStatus' => 'includes/filerepo/FileRepoStatus.php',
-               'ForeignDBFile' => 'includes/filerepo/ForeignDBFile.php',
-               'ForeignDBRepo' => 'includes/filerepo/ForeignDBRepo.php',
-               'FSRepo' => 'includes/filerepo/FSRepo.php',
-               'Image' => 'includes/filerepo/LocalFile.php',
-               'LocalFile' => 'includes/filerepo/LocalFile.php',
-               'LocalFileDeleteBatch' => 'includes/filerepo/LocalFile.php',
-               'LocalFileRestoreBatch' => 'includes/filerepo/LocalFile.php',
-               'LocalRepo' => 'includes/filerepo/LocalRepo.php',
-               'OldLocalFile' => 'includes/filerepo/OldLocalFile.php',
-               'RepoGroup' => 'includes/filerepo/RepoGroup.php',
-               'UnregisteredLocalFile' => 'includes/filerepo/UnregisteredLocalFile.php',
-
-               # Media
-               'BitmapHandler' => 'includes/media/Bitmap.php',
-               'BmpHandler' => 'includes/media/BMP.php',
-               'DjVuHandler' => 'includes/media/DjVu.php',
-               'MediaHandler' => 'includes/media/Generic.php',
-               'ImageHandler' => 'includes/media/Generic.php',
-               'SvgHandler' => 'includes/media/SVG.php',
-
-               # Normal
-               'UtfNormal' => 'includes/normal/UtfNormal.php',
+               $filename = false;
 
-               # Templates
-               'UsercreateTemplate' => 'includes/templates/Userlogin.php',
-               'UserloginTemplate' => 'includes/templates/Userlogin.php',
+               if ( isset( $wgAutoloadLocalClasses[$className] ) ) {
+                       $filename = $wgAutoloadLocalClasses[$className];
+               } elseif ( isset( $wgAutoloadClasses[$className] ) ) {
+                       $filename = $wgAutoloadClasses[$className];
+               } elseif ( $wgAutoloadAttemptLowercase ) {
+                       /*
+                        * Try a different capitalisation.
+                        *
+                        * PHP 4 objects are always serialized with the classname coerced to lowercase,
+                        * and we are plagued with several legacy uses created by MediaWiki < 1.5, see
+                        * https://wikitech.wikimedia.org/wiki/Text_storage_data
+                        */
+                       $lowerClass = strtolower( $className );
 
-               # Languages
-               'Language' => 'languages/Language.php',
-               'RandomPage' => 'includes/SpecialRandompage.php',
+                       if ( self::$autoloadLocalClassesLower === null ) {
+                               self::$autoloadLocalClassesLower = array_change_key_case( $wgAutoloadLocalClasses, CASE_LOWER );
+                       }
 
-               # API
-               'ApiBase' => 'includes/api/ApiBase.php',
-               'ApiFormatFeedWrapper' => 'includes/api/ApiFormatBase.php',
-               'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
-               'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
-               'Services_JSON' => 'includes/api/ApiFormatJson_json.php',
-               'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
-               'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
-               'ApiFormatWddx' => 'includes/api/ApiFormatWddx.php',
-               'ApiFormatXml' => 'includes/api/ApiFormatXml.php',
-               'Spyc' => 'includes/api/ApiFormatYaml_spyc.php',
-               'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
-               'ApiHelp' => 'includes/api/ApiHelp.php',
-               'ApiLogin' => 'includes/api/ApiLogin.php',
-               'ApiMain' => 'includes/api/ApiMain.php',
-               'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
-               'ApiPageSet' => 'includes/api/ApiPageSet.php',
-               'ApiQuery' => 'includes/api/ApiQuery.php',
-               'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php',
-               'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
-               'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
-               'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
-               'ApiQueryGeneratorBase' => 'includes/api/ApiQueryBase.php',
-               'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
-               'ApiQueryCategories' => 'includes/api/ApiQueryCategories.php',
-               'ApiQueryCategoryMembers' => 'includes/api/ApiQueryCategoryMembers.php',
-               'ApiQueryContributions' => 'includes/api/ApiQueryUserContributions.php',
-               'ApiQueryExternalLinks' => 'includes/api/ApiQueryExternalLinks.php',
-               'ApiQueryExtLinksUsage' => 'includes/api/ApiQueryExtLinksUsage.php',
-               'ApiQueryImages' => 'includes/api/ApiQueryImages.php',
-               'ApiQueryImageInfo' => 'includes/api/ApiQueryImageInfo.php',
-               'ApiQueryInfo' => 'includes/api/ApiQueryInfo.php',
-               'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
-               'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
-               'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
-               'ApiQueryRecentChanges'=> 'includes/api/ApiQueryRecentChanges.php',
-               'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
-               'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
-               'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
-               'ApiQueryUserInfo' => 'includes/api/ApiQueryUserInfo.php',
-               'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
-               'ApiResult' => 'includes/api/ApiResult.php',
-       );
-       
-       wfProfileIn( __METHOD__ );
-       if ( isset( $localClasses[$className] ) ) {
-               $filename = $localClasses[$className];
-       } elseif ( isset( $wgAutoloadClasses[$className] ) ) {
-               $filename = $wgAutoloadClasses[$className];
-       } else {
-               # Try a different capitalisation
-               # The case can sometimes be wrong when unserializing PHP 4 objects
-               $filename = false;
-               $lowerClass = strtolower( $className );
-               foreach ( $localClasses as $class2 => $file2 ) {
-                       if ( strtolower( $class2 ) == $lowerClass ) {
-                               $filename = $file2;
+                       if ( isset( self::$autoloadLocalClassesLower[$lowerClass] ) ) {
+                               if ( function_exists( 'wfDebugLog' ) ) {
+                                       wfDebugLog( 'autoloader', "Class {$className} was loaded using incorrect case" );
+                               }
+                               $filename = self::$autoloadLocalClassesLower[$lowerClass];
                        }
                }
+
                if ( !$filename ) {
-                       # Give up
-                       wfProfileOut( __METHOD__ );
+                       // Class not found; let the next autoloader try to find it
                        return;
                }
+
+               // Make an absolute path, this improves performance by avoiding some stat calls
+               if ( substr( $filename, 0, 1 ) != '/' && substr( $filename, 1, 1 ) != ':' ) {
+                       global $IP;
+                       $filename = "$IP/$filename";
+               }
+
+               require $filename;
        }
 
-       # Make an absolute path, this improves performance by avoiding some stat calls
-       if ( substr( $filename, 0, 1 ) != '/' && substr( $filename, 1, 1 ) != ':' ) {
-               global $IP;
-               $filename = "$IP/$filename";
+       /**
+        * Method to clear the protected class property $autoloadLocalClassesLower.
+        * Used in tests.
+        */
+       static function resetAutoloadLocalClassesLower() {
+               self::$autoloadLocalClassesLower = null;
        }
-       require( $filename );
-       wfProfileOut( __METHOD__ );
 }
 
-function wfLoadAllExtensions() {
-       global $wgAutoloadClasses;
-
-       # It is crucial that SpecialPage.php is included before any special page 
-       # extensions are loaded. Otherwise the parent class will not be available
-       # when APC loads the early-bound extension class. Normally this is 
-       # guaranteed by entering special pages via SpecialPage members such as 
-       # executePath(), but here we have to take a more explicit measure.
-       
-       require_once( dirname(__FILE__) . '/SpecialPage.php' );
-       
-       foreach( $wgAutoloadClasses as $class => $file ) {
-               if( !( class_exists( $class ) || interface_exists( $class ) ) ) {
-                       require( $file );
-               }
-       }
-}
\ No newline at end of file
+spl_autoload_register( [ 'AutoLoader', 'autoload' ] );