Completed
Branch BETA-4.9-message-activity (c2a8e0)
by
unknown
18:28 queued 10s
created

EEH_Autoloader::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 7
rs 9.4285
cc 2
eloc 5
nc 2
nop 0
1
<?php
2
if (!defined('EVENT_ESPRESSO_VERSION') )
3
	exit('NO direct script access allowed');
4
5
/**
6
 * EEH_Autoloader
7
 *
8
 * This is a helper utility class for setting up autoloaders.
9
 *
10
 * @package		Event Espresso
11
 * @subpackage	/helpers/EEH_Autoloader.helper.php
12
 * @author		Darren Ethier
13
 *
14
 * ------------------------------------------------------------------------
15
 */
16
class EEH_Autoloader extends EEH_Base {
17
18
19
	/**
20
	 *    instance of the EE_System object
21
	 *
22
	 * @var    $_instance
23
	 * @access    private
24
	 */
25
	private static $_instance = null;
26
27
	/**
28
	* 	$_autoloaders
29
	* 	@var array $_autoloaders
30
	* 	@access 	private
31
	*/
32
	private static $_autoloaders;
33
34
	/**
35
	 * set to "paths" to display autoloader class => path mappings
36
	 * set to "times" to display autoloader loading times
37
	 * set to "all" to display both
38
	 *
39
	 * @var string $debug
40
	 * @access    private
41
	 */
42
	public static $debug = false;
43
44
45
46
	/**
47
	 *    class constructor
48
	 *
49
	 * @access    private
50
	 * @return \EEH_Autoloader
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
51
	 */
52
	private function __construct() {
53
		if ( self::$_autoloaders === null ) {
54
			self::$_autoloaders = array();
55
			$this->_register_custom_autoloaders();
56
			spl_autoload_register( array( $this, 'espresso_autoloader' ) );
57
		}
58
	}
59
60
61
62
	/**
63
	 * @access public
64
	 * @return EEH_Autoloader
65
	 */
66
	public static function instance() {
67
		// check if class object is instantiated
68
		if ( ! self::$_instance instanceof EEH_Autoloader ) {
69
			self::$_instance = new self();
70
		}
71
		return self::$_instance;
72
	}
73
74
75
76
	/**
77
	 *    espresso_autoloader
78
	 *
79
	 * @access    public
80
	 * @param 	$class_name
81
	 * @internal  param $className
82
	 * @internal  param string $class_name - simple class name ie: session
83
	 * @return 	void
84
	 */
85
	public static function espresso_autoloader( $class_name ) {
86
		if ( isset( self::$_autoloaders[ $class_name ] ) ) {
87
			require_once( self::$_autoloaders[ $class_name ] );
88
		}
89
	}
90
91
92
93
	/**
94
	 *    register_autoloader
95
	 *
96
	 * @access    public
97
	 * @param array | string $class_paths - array of key => value pairings between class names and paths
98
	 * @param bool           $read_check  true if we need to check whether the file is readable or not.
99
	 * @param bool           $debug **deprecated**
100
	 * @throws \EE_Error
101
	 */
102
	public static function register_autoloader( $class_paths, $read_check = true, $debug = false ) {
103
		$class_paths = is_array( $class_paths ) ? $class_paths : array( $class_paths );
104
		foreach ( $class_paths as $class => $path ) {
105
			// don't give up! you gotta...
106
			// get some class
107
			if ( empty( $class )) {
108
				throw new EE_Error ( sprintf( __( 'No Class name was specified while registering an autoloader for the following path: %s.','event_espresso' ), $path ));
109
			}
110
			// one day you will find the path young grasshopper
111
			if ( empty( $path )) {
112
				throw new EE_Error ( sprintf( __( 'No path was specified while registering an autoloader for the %s class.','event_espresso' ), $class ));
113
			}
114
			// is file readable ?
115
			if ( $read_check && ! is_readable( $path )) {
116
				throw new EE_Error ( sprintf( __( 'The file for the %s class could not be found or is not readable due to file permissions. Please ensure the following path is correct: %s','event_espresso' ), $class, $path ));
117
			}
118
			if ( ! isset( self::$_autoloaders[ $class ] )) {
119
				self::$_autoloaders[ $class ] = str_replace( array( '/', '\\' ), DS, $path );
120
				if ( EE_DEBUG && ( EEH_Autoloader::$debug === 'paths' || EEH_Autoloader::$debug === 'all' || $debug ) ) {
121
					EEH_Debug_Tools::printr( self::$_autoloaders[ $class ], $class, __FILE__, __LINE__ );
122
				}
123
			}
124
		}
125
	}
126
127
128
129
130
	/**
131
	 * 	get_autoloaders
132
	 *
133
	 * 	@access public
134
	 * 	@return array
135
	 */
136
	public static function get_autoloaders() {
137
		return self::$_autoloaders;
138
	}
139
140
141
142
143
	/**
144
	 * 	register core, model and class 'autoloaders'
145
	 *
146
	 * 	@access private
147
	 * 	@return void
148
	 */
149
	private function _register_custom_autoloaders() {
150
		EEH_Autoloader::$debug = '';
151
		\EEH_Autoloader::register_helpers_autoloaders();
152
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_CORE . 'interfaces' );
153
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_CORE );
154
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_INTERFACES, true );
155
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_MODELS, true );
156
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_CLASSES );
157
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_FORM_SECTIONS, true );
158
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_LIBRARIES . 'messages' );
159
		if ( EEH_Autoloader::$debug === 'times' || EEH_Autoloader::$debug === 'all' ) {
160
			EEH_Debug_Tools::instance()->show_times();
161
		}
162
	}
163
164
165
166
	/**
167
	 *    register core, model and class 'autoloaders'
168
	 *
169
	 * @access public
170
	 */
171
	public static function register_helpers_autoloaders() {
172
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_HELPERS );
173
	}
174
175
176
177
178
	/**
179
	 * 	register core, model and class 'autoloaders'
180
	 *
181
	 * 	@access public
182
	 * 	@return void
183
	 */
184
	public static function register_form_sections_autoloaders() {
185
		//EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_FORM_SECTIONS, true );
186
	}
187
188
189
190
191
	/**
192
	 * 	register core, model and class 'autoloaders'
193
	 *
194
	 * 	@access public
195
	 * 	@return void
196
	 */
197
	public static function register_line_item_display_autoloaders() {
198
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(  EE_LIBRARIES . 'line_item_display' , true );
199
	}
200
201
202
203
204
	/**
205
	 * 	register core, model and class 'autoloaders'
206
	 *
207
	 * 	@access public
208
	 * 	@return void
209
	 */
210
	public static function register_line_item_filter_autoloaders() {
211
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(  EE_LIBRARIES . 'line_item_filters' , true );
212
	}
213
214
215
216
217
	/**
218
	 * 	register template part 'autoloaders'
219
	 *
220
	 * 	@access public
221
	 * 	@return void
222
	 */
223
	public static function register_template_part_autoloaders() {
224
		EEH_Autoloader::register_autoloaders_for_each_file_in_folder( EE_LIBRARIES . 'template_parts', true );
225
	}
226
227
228
229
	/**
230
	 * Assumes all the files in this folder have the normal naming scheme (namely that their classname
231
	 * is the file's name, plus ".whatever.php".) and adds each of them to the autoloader list.
232
	 * If that's not the case, you'll need to improve this function or just use EEH_File::get_classname_from_filepath_with_standard_filename() directly.
233
	 * Yes this has to scan the directory for files, but it only does it once -- not on EACH
234
	 * time the autoloader is used
235
	 *
236
	 * @param string $folder name, with or without trailing /, doesn't matter
237
	 * @param bool   $recursive
238
	 * @param bool   $debug  **deprecated**
239
	 * @throws \EE_Error
240
	 */
241
	public static function register_autoloaders_for_each_file_in_folder( $folder, $recursive = false, $debug = false ){
242 View Code Duplication
		if ( EEH_Autoloader::$debug === 'times' || EEH_Autoloader::$debug === 'all' || $debug ) {
243
			EEH_Debug_Tools::instance()->start_timer( basename( $folder ) );
244
		}
245
		// make sure last char is a /
246
		$folder .= $folder[strlen($folder)-1] !== DS ? DS : '';
247
		$class_to_filepath_map = array();
248
		$exclude = array( 'index' );
249
		//get all the files in that folder that end in php
250
		$filepaths = glob( $folder.'*');
251
252
		if ( empty( $filepaths ) ) {
253
			return;
254
		}
255
256
		foreach( $filepaths as $filepath ) {
257
			if ( substr( $filepath, -4, 4 ) === '.php' ) {
258
				$class_name = EEH_File::get_classname_from_filepath_with_standard_filename( $filepath );
259
				if ( ! in_array( $class_name, $exclude )) {
260
					$class_to_filepath_map [ $class_name ] = $filepath;
261
				}
262
			} else if ( $recursive ) {
263
				EEH_Autoloader::register_autoloaders_for_each_file_in_folder( $filepath, $recursive, $debug );
264
			}
265
		}
266
		// we remove the necessity to do a is_readable() check via the $read_check flag because glob by nature will not return non_readable files/directories.
267
		self::register_autoloader( $class_to_filepath_map, false, $debug );
268 View Code Duplication
		if ( EEH_Autoloader::$debug === 'times' || EEH_Autoloader::$debug === 'all' ) {
269
			EEH_Debug_Tools::instance()->stop_timer( basename( $folder ) );
270
		}
271
	}
272
273
274
275
	/**
276
	 * add_alias
277
	 * register additional autoloader based on variation of the classname for an existing autoloader
278
	 *
279
	 * @access    public
280
	 * @param string $class_name - simple class name ie: EE_Session
281
	 * @param string $alias - variation on class name ie: EE_session, session, etc
282
	 */
283
	public static function add_alias( $class_name, $alias ) {
284
		if ( isset( self::$_autoloaders[ $class_name ] ) ) {
285
			self::$_autoloaders[ $alias ] = self::$_autoloaders[ $class_name ];
286
		}
287
	}
288
289
290
291
}
292