Make WordPress Core

Ticket #36335: classes-real.php

File classes-real.php, 8.7 KB (added by rmccue, 10 years ago)

Proposed actual code for the autoloaders

Line 
1<?php
2
3class WP_Autoload_Prefixed {
4 protected $prefix;
5 protected $path;
6 public function __construct( $prefix, $path ) {
7 $this->prefix = strtolower( $prefix );
8 $this->path = trailingslashit( $path );
9 }
10 public function load_class( $class ) {
11 $class = strtolower( $class );
12 if ( strpos( $class, $this->prefix ) !== 0 ) {
13 return;
14 }
15
16 $filename = 'class-' . str_replace( '_', '-', $class ) . '.php';
17 include $this->path . $filename;
18 }
19}
20class WP_Autoload_PSR0 {
21 protected $prefix;
22 protected $path;
23 public function __construct( $prefix, $path ) {
24 $this->prefix = $prefix;
25 $this->path = trailingslashit( $path );
26 }
27 public function load_class( $class ) {
28 if ( strpos( $class, $this->prefix ) !== 0 ) {
29 return;
30 }
31
32 $parts = explode( '_', substr( $class, strlen( $this->prefix ) ) );
33 $filename = implode( '/', $parts ) . '.php';
34 include $this->path . $filename;
35 }
36}
37class WP_Autoload_ClassMap {
38 protected $map;
39 public function __construct( $map ) {
40 $this->map = $map;
41 }
42 public function load_class( $class ) {
43 if ( ! isset( $this->map[ $class ] ) ) {
44 return;
45 }
46
47 require $this->map[ $class ];
48 }
49}
50
51// Legacy
52$legacy_map = new WP_Autoload_ClassMap([
53 'WP' => 'wp-includes/class-wp.php',
54 'wpdb' => 'wp-includes/wp-db.php',
55 'WP_Date_Query' => 'wp-includes/date.php',
56 'WP_Locale' => 'wp-includes/locale.php',
57 'WP_oEmbed' => 'wp-includes/class-oembed.php',
58 'WP_Query' => 'wp-includes/query.php',
59 'WP_User_Meta_Session_Tokens' => 'wp-includes/session.php',
60
61 // Back-compat
62 'WP_HTTP_Fsockopen' => 'wp-includes/class-wp-http-streams.php',
63
64 // Old Customizer
65 'WP_Customize_Control' => 'wp-includes/class-wp-customize-control.php',
66 'WP_Customize_Panel' => 'wp-includes/class-wp-customize-panel.php',
67 'WP_Customize_Section' => 'wp-includes/class-wp-customize-section.php',
68 'WP_Customize_Setting' => 'wp-includes/class-wp-customize-setting.php',
69
70 // Dependencies (uses dot instead of dash)
71 'WP_Dependencies' => 'wp-includes/class.wp-dependencies.php',
72 '_WP_Dependency' => 'wp-includes/class.wp-dependencies.php',
73 'WP_Scripts' => 'wp-includes/class.wp-scripts.php',
74 'WP_Styles' => 'wp-includes/class.wp-styles.php',
75
76 // Widgets
77 'WP_Widget_Factory' => 'wp-includes/class-wp-widget-factory.php',
78
79 // Walkers
80 'Walker' => 'wp-includes/class-wp-walker.php',
81 'Walker_CategoryDropdown' => 'wp-includes/class-walker-category-dropdown.php',
82 'Walker_PageDropdown' => 'wp-includes/class-walker-page-dropdown.php',
83
84 // Diff
85 'WP_Text_Diff_Renderer_Table' => 'wp-includes/wp-diff.php',
86 'WP_Text_Diff_Renderer_inline' => 'wp-includes/wp-diff.php',
87]);
88spl_autoload_register( array( $legacy_map, 'load_class' ) );
89
90// Admin-only
91$admin_map = new WP_Autoload_ClassMap([
92 // List tables
93 'WP_Comments_List_Table' => 'wp-admin/includes/class-wp-comments-list-table.php',
94 'WP_Links_List_Table' => 'wp-admin/includes/class-wp-links-list-table.php',
95 'WP_List_Table' => 'wp-admin/includes/class-wp-list-table.php',
96 'WP_Media_List_Table' => 'wp-admin/includes/class-wp-media-list-table.php',
97 'WP_MS_Sites_List_Table' => 'wp-admin/includes/class-wp-ms-sites-list-table.php',
98 'WP_MS_Themes_List_Table' => 'wp-admin/includes/class-wp-ms-themes-list-table.php',
99 'WP_MS_Users_List_Table' => 'wp-admin/includes/class-wp-ms-users-list-table.php',
100 'WP_Plugin_Install_List_Table' => 'wp-admin/includes/class-wp-plugin-install-list-table.php',
101 'WP_Plugins_List_Table' => 'wp-admin/includes/class-wp-plugins-list-table.php',
102 'WP_Post_Comments_List_Table' => 'wp-admin/includes/class-wp-post-comments-list-table.php',
103 'WP_Posts_List_Table' => 'wp-admin/includes/class-wp-posts-list-table.php',
104 'WP_Terms_List_Table' => 'wp-admin/includes/class-wp-terms-list-table.php',
105 'WP_Theme_Install_List_Table' => 'wp-admin/includes/class-wp-theme-install-list-table.php',
106 'WP_Themes_List_Table' => 'wp-admin/includes/class-wp-themes-list-table.php',
107 'WP_Users_List_Table' => 'wp-admin/includes/class-wp-users-list-table.php',
108 '_WP_List_Table' => 'wp-admin/includes/list-table.php',
109 '_WP_List_Table_Compat' => 'wp-admin/includes/list-table.php',
110
111 // Skins
112 'WP_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
113 'Plugin_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
114 'Bulk_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
115 'Bulk_Plugin_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
116 'Bulk_Theme_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
117 'Plugin_Installer_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
118 'Theme_Installer_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
119 'Theme_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
120 'Language_Pack_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
121 'Automatic_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
122
123 // Upgraders
124 'WP_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
125 'Plugin_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
126 'Theme_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
127 'Language_Pack_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
128 'Core_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
129 'File_Upload_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
130 'WP_Automatic_Updater' => 'wp-admin/includes/class-wp-upgrader.php',
131
132 // Admin walkers
133 'Walker_Category_Checklist' => 'wp-admin/includes/class-walker-category-checklist.php',
134 'Walker_Nav_Menu_Checklist' => 'wp-admin/includes/class-walker-nav-menu-checklist.php',
135 'Walker_Nav_Menu_Edit' => 'wp-admin/includes/class-walker-nav-menu-edit.php',
136
137 // Others!
138 'Custom_Background' => 'wp-admin/custom-background.php',
139 'Custom_Image_Header' => 'wp-admin/custom-header.php',
140 'WP_Importer' => 'wp-admin/includes/class-wp-importer.php',
141 'WP_Press_This' => 'wp-admin/includes/class-wp-press-this.php',
142 'WP_Site_Icon' => 'wp-admin/includes/class-wp-site-icon.php',
143]);
144spl_autoload_register( array( $admin_map, 'load_class' ) );
145
146// Externals
147$external_map = new WP_Autoload_ClassMap([
148 // AtomLib
149 'AtomFeed' => 'wp-includes/atomlib.php',
150 'AtomEntry' => 'wp-includes/atomlib.php',
151 'AtomParser' => 'wp-includes/atomlib.php',
152
153 // FTP handling
154 'ftp' => 'wp-admin/includes/class-ftp.php',
155 'ftp_base' => 'wp-admin/includes/class-ftp.php',
156
157 // IXR
158 'IXR_Value' => 'wp-includes/class-IXR.php',
159 'IXR_Date' => 'wp-includes/class-IXR.php',
160
161 // Magpie
162 'MagpieRSS' => 'wp-includes/rss.php',
163 'RSSCache' => 'wp-includes/rss.php',
164
165 // ID3
166 'getid3_asf' => 'wp-includes/ID3/module.audio-video.asf.php',
167 'getid3_flv' => 'wp-includes/ID3/module.audio-video.flv.php',
168 'AMFStream' => 'wp-includes/ID3/module.audio-video.flv.php',
169 'AMFReader' => 'wp-includes/ID3/module.audio-video.flv.php',
170 'AVCSequenceParameterSetReader' => 'wp-includes/ID3/module.audio-video.flv.php',
171 'getid3_riff' => 'wp-includes/ID3/module.audio-video.riff.php',
172
173 // phpass
174 'PasswordHash' => 'wp-includes/class-phpass.php',
175
176 // POMO
177 'Translation_Entry' => 'wp-includes/pomo/entry.php',
178 'MO' => 'wp-includes/pomo/mo.php',
179 'PO' => 'wp-includes/pomo/po.php',
180 'POMO_Reader' => 'wp-includes/pomo/streams.php',
181 'POMO_FileReader' => 'wp-includes/pomo/streams.php',
182 'POMO_StringReader' => 'wp-includes/pomo/streams.php',
183 'POMO_CachedFileReader' => 'wp-includes/pomo/streams.php',
184 'POMO_CachedIntFileReader' => 'wp-includes/pomo/streams.php',
185 'Translations' => 'wp-includes/pomo/translations.php',
186 'Gettext_Translations' => 'wp-includes/pomo/translations.php',
187 'NOOP_Translations' => 'wp-includes/pomo/translations.php',
188
189 // POP3
190 'POP3' => 'wp-includes/class-pop3.php',
191
192 // Text_Diff
193 'Text_Diff' => 'wp-includes/Text/Diff.php',
194 'Text_MappedDiff' => 'wp-includes/Text/Diff.php',
195 'Text_Diff_Op' => 'wp-includes/Text/Diff.php',
196 'Text_Diff_Op_copy' => 'wp-includes/Text/Diff.php',
197 'Text_Diff_Op_change' => 'wp-includes/Text/Diff.php',
198 'Text_Diff_Op_delete' => 'wp-includes/Text/Diff.php',
199 'Text_Diff_Op_add' => 'wp-includes/Text/Diff.php',
200]);
201spl_autoload_register( array( $external_map, 'load_class' ) );
202
203$diff = new WP_Autoload_PSR0( 'Text_Diff_', 'wp-includes/Text/Diff/' );
204spl_autoload_register( array( $diff, 'load_class' ) );
205
206$prefixed = [
207 // Subdirs of includes
208 'wp_customize_' => 'wp-includes/customize/',
209 'wp_rest_' => 'wp-includes/rest-api/',
210 'wp_widget_' => 'wp-includes/widgets/',
211
212 // Admin-specific
213 'wp_filesystem_' => 'wp-admin/includes/',
214
215 // Catch-all
216 'wp_' => 'wp-includes/',
217 'walker_' => 'wp-includes/',
218];
219foreach ( $prefixed as $prefix => $path ) {
220 $loader = new WP_Autoload_Prefixed( $prefix, $path );
221 spl_autoload_register( array( $loader, 'load_class' ) );
222}