PluginProbe ʕ •ᴥ•ʔ
Pods – Custom Content Types and Fields / 2.8.23.5
Pods – Custom Content Types and Fields v2.8.23.5
2.7.31.4 2.8.23.5 2.9.19.5 3.0.10.5 3.1.4.3 3.2.8.4 3.3.9.2 2.8.23.4 2.9.19.4 3.0.10.4 3.1.4.2 3.2.8.3 3.3.9.1 trunk 1.14.8 2.7.31.3 2.8.23.3 2.9.19.3 3.0.10.3 3.1.4.1 3.2.0 3.2.1 3.2.1.1 3.2.2 3.2.4 3.2.5 3.2.6 3.2.7 3.2.7.1 3.2.8 3.2.8.1 3.2.8.2 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9
pods / tribe-common / src / Tribe / Autoloader.php
pods / tribe-common / src / Tribe Last commit date
Admin 1 week ago Ajax 1 week ago Asset 1 week ago Context 1 week ago Customizer 1 week ago Debug_Bar 1 week ago Dialog 1 week ago Documentation 1 week ago Duplicate 1 week ago Editor 1 week ago Image 1 week ago JSON_LD 1 week ago Languages 1 week ago Log 1 week ago Meta 1 week ago Models 1 week ago PUE 1 week ago Process 1 week ago Promoter 1 week ago REST 1 week ago Repository 1 week ago Service_Providers 1 week ago Shortcode 1 week ago Support 1 week ago Tabbed_View 1 week ago Tooltip 1 week ago Traits 1 week ago Utils 1 week ago Validator 1 week ago Widget 1 week ago Abstract_Deactivation.php 1 week ago Abstract_Plugin_Register.php 1 week ago App_Shop.php 1 week ago Assets.php 1 week ago Assets_Pipeline.php 1 week ago Autoloader.php 1 week ago Cache.php 1 week ago Cache_Listener.php 1 week ago Changelog_Reader.php 1 week ago Container.php 1 week ago Context.php 1 week ago Cost_Utils.php 1 week ago Credits.php 1 week ago Customizer.php 1 week ago DB_Lock.php 1 week ago Data.php 1 week ago Date_Utils.php 1 week ago Db.php 1 week ago Debug.php 1 week ago Dependency.php 1 week ago Deprecation.php 1 week ago Editor.php 1 week ago Error.php 1 week ago Exception.php 1 week ago Extension.php 1 week ago Extension_Loader.php 1 week ago Feature_Detection.php 1 week ago Field.php 1 week ago Field_Conditional.php 1 week ago Freemius.php 1 week ago Log.php 1 week ago Main.php 1 week ago Notices.php 1 week ago Plugin_Meta_Links.php 1 week ago Plugins.php 1 week ago Plugins_API.php 1 week ago Post_History.php 1 week ago Post_Transient.php 1 week ago Promise.php 1 week ago Repository.php 1 week ago Rewrite.php 1 week ago Settings.php 1 week ago Settings_Manager.php 1 week ago Settings_Tab.php 1 week ago Simple_Table.php 1 week ago Support.php 1 week ago Tabbed_View.php 1 week ago Template.php 1 week ago Template_Factory.php 1 week ago Template_Part_Cache.php 1 week ago Templates.php 1 week ago Terms.php 1 week ago Timezones.php 1 week ago Tracker.php 1 week ago Updater.php 1 week ago Validate.php 1 week ago View_Helpers.php 1 week ago
Autoloader.php
298 lines
1 <?php
2
3 if ( ! class_exists( 'Tribe__Autoloader' ) ) {
4 /**
5 * Class Tribe__Autoloader
6 *
7 * Allows for autoloading of Tribe plugins classes.
8 *
9 * Example usage:
10 *
11 * // will be `/var/www/site/wp-content/plugins/the-events-calendar'
12 * $this_dir = dirname(__FILE__);
13 *
14 * // gets hold of the singleton instance of the class
15 * $autoloader = Tribe__Autoloader::instance();
16 *
17 * // register one by one or use `register_prefixes` method
18 * $autoloader->register_prefix( 'Tribe__Admin__', $this_dir . '/src/Tribe/admin' );
19 * $autoloader->register_prefix( 'Tribe__Admin__', $this_dir . '/src/Tribe/another-dir' );
20 * $autoloader->register_prefix( 'Tribe__Utils__', $this_dir . '/src/Tribe/another-dir' );
21 *
22 * // register a direct class to path
23 * $autoloader->register_class( 'Tribe__Some_Class', $this_dir . '/some/path/to/Some_Class.php' );
24 *
25 * // register a fallback dir to be searched for the class before giving up
26 * $autoloader->add_fallback_dir( $this_dir . '/all-the-classes' );
27 *
28 * // calls `spl_autoload_register`
29 * $autoloader->register_autoloader();
30 *
31 * // class will be searched in the path
32 * // `/var/www/site/wp-content/plugins/the-events-calendar/src/Tribe/admin/Some_Class.php'
33 * // and
34 * // `/var/www/site/wp-content/plugins/the-events-calendar/src/Tribe/another-dir/Some_Class.php'
35 * $i = new Tribe__Admin__Some_Class();
36 *
37 * // class will be searched in the path
38 * // `/var/www/site/wp-content/plugins/the-events-calendar/utils/some-dir/Some_Util.php'
39 * $i = new Tribe__Utils__Some_Util();
40 *
41 * // class will be searched in the path
42 * // `/var/www/site/wp-content/plugins/the-events-calendar/deprecated/Tribe_DeprecatedClass.php'
43 * $i = new Tribe_DeprecatedClass();
44 */
45 class Tribe__Autoloader {
46
47 /**
48 * @var Tribe__Autoloader
49 */
50 protected static $instance;
51
52 /**
53 * An arrays of arrays each containing absolute paths.
54 *
55 * Paths are stored trimming any trailing `/`.
56 * E.g. `/var/www/tribe-pro/wp-content/plugins/the-events-calendar/src/Tribe`
57 *
58 * @var string[][]
59 */
60 protected $prefixes;
61
62 /**
63 * An array of registered prefixes with unique slugs.
64 *
65 * @var string[]
66 */
67 protected $prefix_slugs;
68
69 /**
70 * The string acting as a directory separator in a class name.
71 *
72 * E.g.: given `__` as `$dir_separator` then `Admin__Metabox__Some_Metabox`
73 * will map to `/Admin/Metabox/SomeMetabox.php`.
74 *
75 * @var string
76 */
77 protected $dir_separator = '__';
78
79 /** @var string[] */
80 protected $fallback_dirs = [];
81
82 /**
83 * @var array
84 */
85 protected $class_paths = [];
86
87 /**
88 * Returns the singleton instance of the class.
89 *
90 * @return Tribe__Autoloader
91 */
92 public static function instance() {
93 if ( ! self::$instance instanceof Tribe__Autoloader ) {
94 self::$instance = new self();
95 }
96
97 return self::$instance;
98 }
99
100 /**
101 * Registers prefixes and root dirs using an array.
102 *
103 * Same as calling `register_prefix` on each one.
104 *
105 * @param array $prefixes_to_root_dirs
106 */
107 public function register_prefixes( array $prefixes_to_root_dirs ) {
108 foreach ( $prefixes_to_root_dirs as $prefix => $root_dir ) {
109 $this->register_prefix( $prefix, $root_dir );
110 }
111 }
112
113 /**
114 * Associates a class prefix to an absolute path.
115 *
116 * @param string $prefix A class prefix, e.g. `Tribe__Admin__`
117 * @param string $root_dir The absolute path to the dir containing
118 * the prefixed classes.
119 * @param string $slug An optional unique slug to associate to the prefix.
120 */
121 public function register_prefix( $prefix, $root_dir, $slug = '' ) {
122 $root_dir = $this->normalize_root_dir( $root_dir );
123
124 // Determine if we need to normalize the $prefix.
125 $is_namespaced = false !== strpos( $prefix, '\\' );
126
127 if ( $is_namespaced ) {
128 // If the prefix is a namespace, then normalize it.
129 $prefix = trim( $prefix, '\\' ) . '\\';
130 }
131
132 if ( ! isset( $this->prefixes[ $prefix ] ) ) {
133 $this->prefixes[ $prefix ] = [];
134 }
135
136 $this->prefixes[ $prefix ][] = $root_dir;
137
138 // Let's make sure we're not adding duplicates.
139 $this->prefixes[ $prefix ] = array_unique( $this->prefixes[ $prefix ] );
140
141 if ( $slug ) {
142 $this->prefix_slugs[ $slug ] = $prefix;
143 }
144 }
145
146 /**
147 * Triggers the registration of the autoload method in the SPL
148 * autoload register.
149 */
150 public function register_autoloader() {
151 spl_autoload_register( [ $this, 'autoload' ] );
152 }
153
154 /**
155 * Includes the file defining a class.
156 *
157 * This is the function that's registered as an autoloader.
158 *
159 * @param string $class
160 */
161 public function autoload( $class ) {
162 $include_path = $this->get_class_path( $class );
163 if ( ! empty( $include_path ) ) {
164 include_once( $include_path );
165 }
166 }
167
168 private function normalize_root_dir( $root_dir ) {
169 return rtrim( $root_dir, '/' );
170 }
171
172 protected function get_prefixed_path( $class ) {
173 foreach ( $this->prefixes as $prefix => $dirs ) {
174 $is_namespaced = false !== strpos( $prefix, '\\' );
175
176 if ( strpos( $class, $prefix ) !== 0 ) {
177 continue;
178 }
179
180 $class_name = str_replace( $prefix, '', $class );
181
182 if ( ! $is_namespaced ) {
183 $class_path_frag = implode( '/', explode( $this->dir_separator, $class_name ) ) . '.php';
184 } else {
185 $class_path_frag = implode( '/', explode( '\\', $class_name ) ) . '.php';
186 }
187
188 foreach ( $dirs as $dir ) {
189 $path = $dir . '/' . $class_path_frag;
190 if ( ! file_exists( $path ) ) {
191 // check if the file exists in lowercase
192 $class_path_frag = strtolower( $class_path_frag );
193 $path = $dir . '/' . $class_path_frag;
194 }
195 if ( ! file_exists( $path ) ) {
196 continue;
197 }
198
199 return $path;
200 }
201 }
202 return false;
203 }
204
205 protected function get_fallback_path( $class ) {
206 foreach ( $this->fallback_dirs as $fallback_dir ) {
207 $include_path = $fallback_dir . '/' . $class . '.php';
208 if ( ! file_exists( $include_path ) ) {
209 // check if the file exists in lowercase
210 $class = strtolower( $class );
211 $include_path = $fallback_dir . '/' . $class . '.php';
212 }
213 if ( ! file_exists( $include_path ) ) {
214 continue;
215 }
216
217 return $include_path;
218 }
219 }
220
221 /**
222 * Gets the absolute path to a class file.
223 *
224 * @param string $class The class name
225 *
226 * @return string Either the absolute path to the class file or an
227 * empty string if the file was not found.
228 */
229 public function get_class_path( $class ) {
230 $prefixed_path = $this->get_prefixed_path( $class );
231 if ( $prefixed_path ) {
232 return $prefixed_path;
233 }
234
235 $class_path = ! empty( $this->class_paths[ $class ] ) ? $this->class_paths[ $class ] :false;
236 if ( $class_path ) {
237 return $class_path;
238 }
239
240 $fallback_path = $this->get_fallback_path( $class );
241
242 return $fallback_path ? $fallback_path : '';
243 }
244
245 /**
246 * Get the registered prefix by slug
247 *
248 * @param string $slug Unique slug for registered prefix.
249 *
250 * @return false|string Either the prefix registered to the
251 * unique slug or false if not found.
252 */
253 public function get_prefix_by_slug( $slug ) {
254 $prefix = false;
255
256 if ( isset( $this->prefix_slugs[ $slug ] ) ) {
257 $prefix = $this->prefix_slugs[ $slug ];
258 }
259
260 return $prefix;
261 }
262
263 /**
264 * Adds a folder to search for classes that were not found among
265 * the prefixed ones.
266 *
267 * This is the method to use to register a directory of deprecated
268 * classes.
269 *
270 * @param string $dir An absolute path dto a dir.
271 */
272 public function add_fallback_dir( $dir ) {
273 if ( in_array( $dir, $this->fallback_dirs ) ) {
274 return;
275 }
276 $this->fallback_dirs[] = $this->normalize_root_dir( $dir );
277 }
278
279 /**
280 * @return string
281 */
282 public function get_dir_separator() {
283 return $this->dir_separator;
284 }
285
286 /**
287 * @param string $dir_separator
288 */
289 public function set_dir_separator( $dir_separator ) {
290 $this->dir_separator = $dir_separator;
291 }
292
293 public function register_class( $class, $path ) {
294 $this->class_paths[ $class ] = $path;
295 }
296 }
297 }
298