Make WordPress Core

Ticket #36335: classes.php

File classes.php, 9.9 KB (added by rmccue, 10 years ago)

Alternative implementation of autoloading concept

Line 
1<?php
2
3function trailingslashit( $path ) {
4 return ( substr( $path, -1, 1 ) === '/' ) ? $path : $path . '/';
5}
6
7interface WP_Autoload_Handler {
8 /**
9 * @return string|null
10 */
11 public function get_path( $class );
12}
13class WP_Autoload_Prefixed implements WP_Autoload_Handler {
14 protected $prefix;
15 protected $path;
16 public function __construct( $prefix, $path ) {
17 $this->prefix = strtolower( $prefix );
18 $this->path = trailingslashit( $path );
19 }
20 public function get_path( $class ) {
21 $class = strtolower( $class );
22 if ( strpos( $class, $this->prefix ) !== 0 ) {
23 return null;
24 }
25
26 $filename = 'class-' . str_replace( '_', '-', $class ) . '.php';
27 return $this->path . $filename;
28 }
29}
30class WP_Autoload_PSR0 implements WP_Autoload_Handler {
31 protected $prefix;
32 protected $path;
33 public function __construct( $prefix, $path ) {
34 $this->prefix = $prefix;
35 $this->path = trailingslashit( $path );
36 }
37 public function get_path( $class ) {
38 if ( strpos( $class, $this->prefix ) !== 0 ) {
39 return null;
40 }
41
42 $parts = explode( '_', substr( $class, strlen( $this->prefix ) ) );
43 $filename = implode( '/', $parts ) . '.php';
44 return $this->path . $filename;
45 }
46}
47class WP_Autoload_ClassMap implements WP_Autoload_Handler {
48 protected $map;
49 public function __construct( $map ) {
50 $this->map = $map;
51 }
52 public function get_path( $class ) {
53 if ( ! isset( $this->map[ $class ] ) ) {
54 return null;
55 }
56
57 return $this->map[ $class ];
58 }
59}
60
61$wp_autoloaders = [];
62function register_autoloader( WP_Autoload_Handler $handler ) {
63 global $wp_autoloaders;
64 $wp_autoloaders[] = $handler;
65}
66function file_for_class( $class ) {
67 global $wp_autoloaders;
68 foreach ( $wp_autoloaders as $autoloader ) {
69 if ( $path = $autoloader->get_path( $class ) ) {
70 return $path;
71 }
72 }
73
74 return null;
75}
76
77// Legacy
78register_autoloader( new WP_Autoload_ClassMap([
79 'WP' => 'wp-includes/class-wp.php',
80 'wpdb' => 'wp-includes/wp-db.php',
81 'WP_Date_Query' => 'wp-includes/date.php',
82 'WP_Locale' => 'wp-includes/locale.php',
83 'WP_oEmbed' => 'wp-includes/class-oembed.php',
84 'WP_Query' => 'wp-includes/query.php',
85 'WP_User_Meta_Session_Tokens' => 'wp-includes/session.php',
86
87 // Back-compat
88 'WP_HTTP_Fsockopen' => 'wp-includes/class-wp-http-streams.php',
89
90 // Old Customizer
91 'WP_Customize_Control' => 'wp-includes/class-wp-customize-control.php',
92 'WP_Customize_Panel' => 'wp-includes/class-wp-customize-panel.php',
93 'WP_Customize_Section' => 'wp-includes/class-wp-customize-section.php',
94 'WP_Customize_Setting' => 'wp-includes/class-wp-customize-setting.php',
95
96 // Dependencies (uses dot instead of dash)
97 'WP_Dependencies' => 'wp-includes/class.wp-dependencies.php',
98 '_WP_Dependency' => 'wp-includes/class.wp-dependencies.php',
99 'WP_Scripts' => 'wp-includes/class.wp-scripts.php',
100 'WP_Styles' => 'wp-includes/class.wp-styles.php',
101
102 // Widgets
103 'WP_Widget_Factory' => 'wp-includes/class-wp-widget-factory.php',
104
105 // Walkers
106 'Walker' => 'wp-includes/class-wp-walker.php',
107 'Walker_CategoryDropdown' => 'wp-includes/class-walker-category-dropdown.php',
108 'Walker_PageDropdown' => 'wp-includes/class-walker-page-dropdown.php',
109
110 // Diff
111 'WP_Text_Diff_Renderer_Table' => 'wp-includes/wp-diff.php',
112 'WP_Text_Diff_Renderer_inline' => 'wp-includes/wp-diff.php',
113]));
114
115// Admin-only
116register_autoloader( new WP_Autoload_ClassMap([
117 // List tables
118 'WP_Comments_List_Table' => 'wp-admin/includes/class-wp-comments-list-table.php',
119 'WP_Links_List_Table' => 'wp-admin/includes/class-wp-links-list-table.php',
120 'WP_List_Table' => 'wp-admin/includes/class-wp-list-table.php',
121 'WP_Media_List_Table' => 'wp-admin/includes/class-wp-media-list-table.php',
122 'WP_MS_Sites_List_Table' => 'wp-admin/includes/class-wp-ms-sites-list-table.php',
123 'WP_MS_Themes_List_Table' => 'wp-admin/includes/class-wp-ms-themes-list-table.php',
124 'WP_MS_Users_List_Table' => 'wp-admin/includes/class-wp-ms-users-list-table.php',
125 'WP_Plugin_Install_List_Table' => 'wp-admin/includes/class-wp-plugin-install-list-table.php',
126 'WP_Plugins_List_Table' => 'wp-admin/includes/class-wp-plugins-list-table.php',
127 'WP_Post_Comments_List_Table' => 'wp-admin/includes/class-wp-post-comments-list-table.php',
128 'WP_Posts_List_Table' => 'wp-admin/includes/class-wp-posts-list-table.php',
129 'WP_Terms_List_Table' => 'wp-admin/includes/class-wp-terms-list-table.php',
130 'WP_Theme_Install_List_Table' => 'wp-admin/includes/class-wp-theme-install-list-table.php',
131 'WP_Themes_List_Table' => 'wp-admin/includes/class-wp-themes-list-table.php',
132 'WP_Users_List_Table' => 'wp-admin/includes/class-wp-users-list-table.php',
133 '_WP_List_Table' => 'wp-admin/includes/list-table.php',
134 '_WP_List_Table_Compat' => 'wp-admin/includes/list-table.php',
135
136 // Skins
137 'WP_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
138 'Plugin_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
139 'Bulk_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
140 'Bulk_Plugin_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
141 'Bulk_Theme_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
142 'Plugin_Installer_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
143 'Theme_Installer_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
144 'Theme_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
145 'Language_Pack_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
146 'Automatic_Upgrader_Skin' => 'wp-admin/includes/class-wp-upgrader-skins.php',
147
148 // Upgraders
149 'WP_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
150 'Plugin_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
151 'Theme_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
152 'Language_Pack_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
153 'Core_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
154 'File_Upload_Upgrader' => 'wp-admin/includes/class-wp-upgrader.php',
155 'WP_Automatic_Updater' => 'wp-admin/includes/class-wp-upgrader.php',
156
157 // Admin walkers
158 'Walker_Category_Checklist' => 'wp-admin/includes/class-walker-category-checklist.php',
159 'Walker_Nav_Menu_Checklist' => 'wp-admin/includes/class-walker-nav-menu-checklist.php',
160 'Walker_Nav_Menu_Edit' => 'wp-admin/includes/class-walker-nav-menu-edit.php',
161
162 // Others!
163 'Custom_Background' => 'wp-admin/custom-background.php',
164 'Custom_Image_Header' => 'wp-admin/custom-header.php',
165 'WP_Importer' => 'wp-admin/includes/class-wp-importer.php',
166 'WP_Press_This' => 'wp-admin/includes/class-wp-press-this.php',
167 'WP_Site_Icon' => 'wp-admin/includes/class-wp-site-icon.php',
168]));
169
170
171// Externals
172register_autoloader( new WP_Autoload_ClassMap([
173 // AtomLib
174 'AtomFeed' => 'wp-includes/atomlib.php',
175 'AtomEntry' => 'wp-includes/atomlib.php',
176 'AtomParser' => 'wp-includes/atomlib.php',
177
178 // FTP handling
179 'ftp' => 'wp-admin/includes/class-ftp.php',
180 'ftp_base' => 'wp-admin/includes/class-ftp.php',
181
182 // IXR
183 'IXR_Value' => 'wp-includes/class-IXR.php',
184 'IXR_Date' => 'wp-includes/class-IXR.php',
185
186 // Magpie
187 'MagpieRSS' => 'wp-includes/rss.php',
188 'RSSCache' => 'wp-includes/rss.php',
189
190 // ID3
191 'getid3_asf' => 'wp-includes/ID3/module.audio-video.asf.php',
192 'getid3_flv' => 'wp-includes/ID3/module.audio-video.flv.php',
193 'AMFStream' => 'wp-includes/ID3/module.audio-video.flv.php',
194 'AMFReader' => 'wp-includes/ID3/module.audio-video.flv.php',
195 'AVCSequenceParameterSetReader' => 'wp-includes/ID3/module.audio-video.flv.php',
196 'getid3_riff' => 'wp-includes/ID3/module.audio-video.riff.php',
197
198 // phpass
199 'PasswordHash' => 'wp-includes/class-phpass.php',
200
201 // POMO
202 'Translation_Entry' => 'wp-includes/pomo/entry.php',
203 'MO' => 'wp-includes/pomo/mo.php',
204 'PO' => 'wp-includes/pomo/po.php',
205 'POMO_Reader' => 'wp-includes/pomo/streams.php',
206 'POMO_FileReader' => 'wp-includes/pomo/streams.php',
207 'POMO_StringReader' => 'wp-includes/pomo/streams.php',
208 'POMO_CachedFileReader' => 'wp-includes/pomo/streams.php',
209 'POMO_CachedIntFileReader' => 'wp-includes/pomo/streams.php',
210 'Translations' => 'wp-includes/pomo/translations.php',
211 'Gettext_Translations' => 'wp-includes/pomo/translations.php',
212 'NOOP_Translations' => 'wp-includes/pomo/translations.php',
213
214 // POP3
215 'POP3' => 'wp-includes/class-pop3.php',
216
217 // Text_Diff
218 'Text_Diff' => 'wp-includes/Text/Diff.php',
219 'Text_MappedDiff' => 'wp-includes/Text/Diff.php',
220 'Text_Diff_Op' => 'wp-includes/Text/Diff.php',
221 'Text_Diff_Op_copy' => 'wp-includes/Text/Diff.php',
222 'Text_Diff_Op_change' => 'wp-includes/Text/Diff.php',
223 'Text_Diff_Op_delete' => 'wp-includes/Text/Diff.php',
224 'Text_Diff_Op_add' => 'wp-includes/Text/Diff.php',
225]));
226register_autoloader( new WP_Autoload_PSR0( 'Text_Diff_', 'wp-includes/Text/Diff/' ) );
227
228$prefixed = [
229 // Subdirs of includes
230 'wp_customize_' => 'wp-includes/customize/',
231 'wp_rest_' => 'wp-includes/rest-api/',
232 'wp_widget_' => 'wp-includes/widgets/',
233
234 // Admin-specific
235 'wp_filesystem_' => 'wp-admin/includes/',
236
237 // Catch-all
238 'wp_' => 'wp-includes/',
239 'walker_' => 'wp-includes/',
240];
241foreach ( $prefixed as $prefix => $path ) {
242 register_autoloader( new WP_Autoload_Prefixed( $prefix, $path ) );
243}
244
245$file = fopen( 'classes.csv', 'r' );
246
247$classes = [];
248while ( ( $fields = fgetcsv( $file ) ) !== false ) {
249 $classes[] = [ 'file' => $fields[0], 'class' => $fields[1] ];
250}
251fclose( $file );
252
253?>
254<style>
255html, body {
256 font-family: sans-serif;
257 color: #333;
258}
259table {
260 width: 100%;
261}
262.match {
263 /*background: rgba( 0, 255, 0, 0.08 );*/
264}
265.no-match {
266 background: rgba( 255, 0, 0, 0.08 );
267}
268</style>
269
270<table>
271 <thead>
272 <tr>
273 <th>Class</th>
274 <th>File</th>
275 <th>Expected</th>
276 </tr>
277 </thead>
278 <tbody>
279 <?php foreach ( $classes as $data ): ?>
280 <?php $expected = file_for_class( $data['class'] ) ?>
281
282 <tr>
283
284 <td><?php echo $data['class'] ?></td>
285 <td><?php echo $data['file'] ?></td>
286 <td class="<?php echo ( $expected === $data['file'] ? 'match' : 'no-match' ) ?>">
287 <?php echo $expected ?>
288 </td>
289
290 </tr>
291
292 <?php endforeach ?>
293 </tbody>
294</table>