38217-vm/wp-content/themes/Avada/includes/lib/inc/class-fusion-library-autoloader.php
2026-02-05 17:08:59 +03:00

209 lines
7.4 KiB
PHP

<?php
/**
* Fusion Library Autoloader.
* Manages loading other class files.
*
* @package Fusion-Library
*/
/**
* The autoloader class.
*/
class Fusion_Library_Autoloader {
/**
* If there are multiple locations for Fusion-Library,
* they are all added here.
*
* @static
* @access private
* @var array
*/
private static $locations = [];
/**
* An array of the class paths we've located.
*
* @access private
* @var array
*/
private $paths = [];
/**
* Since Fusion-Library can be included multiple times
* we need this class to be a singleton.
* This var holds the one true instance of this object.
*
* @static
* @access private
* @var object
*/
private static $instance;
/**
* Class path map.
*
* @static
* @access private
* @since 2.2.0
* @var array
*/
private static $path_map;
/**
* Constructor.
*
* @access private
*/
private function __construct() {
spl_autoload_register( [ $this, 'include_file' ] );
}
/**
* Gets the one true instance of this class.
*
* @access public
* @return object.
*/
public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Include the file if found.
*
* @access private
* @param string $class_name The class-name we're looking for.
*/
private function include_file( $class_name ) {
if ( ! isset( $this->paths[ $class_name ] ) ) {
$this->paths[ $class_name ] = $this->locate_file( $class_name );
}
// Only process if file was found.
// If it doesn't exist, then the locate_file() method returned false.
if ( $this->paths[ $class_name ] ) {
include_once $this->paths[ $class_name ];
}
}
/**
* Locate the class file
*
* @access private
* @param string $class_name The class-name we're looking for.
* @return string|false If false, file was not located.
*/
private function locate_file( $class_name ) {
// Return false if the class does not start with "Fusion" or "AWB".
if ( 0 !== stripos( $class_name, 'Fusion' ) && 0 !== stripos( $class_name, 'AWB' ) ) {
return false;
}
$map = $this->get_class_map();
if ( isset( $map[ $class_name ] ) ) {
return $map[ $class_name ];
}
// Extrapolate the filename from the class-name.
$filename = 'class-' . strtolower( str_replace( '_', '-', $class_name ) ) . '.php';
// Go through all instances of the files in case of multiple installations
// and add their version as key in the array.
$paths = [];
foreach ( self::$locations as $version => $location ) {
$file = wp_normalize_path( $location . '/inc/' . $filename );
if ( ! file_exists( $file ) ) {
continue;
}
$paths[ $version ] = $file;
}
// Reorder versions to make sure newest is first.
krsort( $paths );
// This is a pseudo-loop.
// We're not actually looping though all items here,
// we're simply returning the 1st element of the array.
// It only acts as a loop if the 1st element is empty.
foreach ( $paths as $path ) {
if ( $path ) {
// Return 1st (newest version) path.
return $path;
}
}
return false;
}
/**
* Add a location to the self::$locations array.
*
* @static
* @access public
* @param string $path The path to add.
* @param string $version The fusion-library version.
*/
public static function add_location( $path, $version ) {
if ( ! isset( self::$locations[ $version ] ) ) {
self::$locations[ $version ] = $path;
}
}
/**
* Returns an array of known classnames along with their paths.
*
* @access public
* @since 2.0
* @return array
*/
public function get_class_map() {
if ( ! self::$path_map ) {
self::$path_map = [
'Fusion' => FUSION_LIBRARY_PATH . '/inc/class-fusion.php',
'Fusion_Images' => FUSION_LIBRARY_PATH . '/inc/class-fusion-images.php',
'AWB_Widget_Framework' => FUSION_LIBRARY_PATH . '/inc/class-awb-widget-framework.php',
'AWB_Widget_Style' => FUSION_LIBRARY_PATH . '/inc/class-awb-widget-style.php',
'Fusion_Settings' => FUSION_LIBRARY_PATH . '/inc/class-fusion-settings.php',
'Fusion_Multilingual' => FUSION_LIBRARY_PATH . '/inc/class-fusion-multilingual.php',
'Fusion_Sanitize' => FUSION_LIBRARY_PATH . '/inc/class-fusion-sanitize.php',
'Fusion_Scripts' => FUSION_LIBRARY_PATH . '/inc/class-fusion-scripts.php',
'Fusion_Dynamic_JS' => FUSION_LIBRARY_PATH . '/inc/class-fusion-dynamic-js.php',
'Fusion_Media_Query_Scripts' => FUSION_LIBRARY_PATH . '/inc/class-fusion-media-query-scripts.php',
'Fusion_Font_Awesome' => FUSION_LIBRARY_PATH . '/inc/class-fusion-font-awesome.php',
'Fusion_Social_Sharing' => FUSION_LIBRARY_PATH . '/inc/class-fusion-social-sharing.php',
'Fusion_Social_Icon' => FUSION_LIBRARY_PATH . '/inc/class-fusion-social-icon.php',
'Fusion_Product_Registration' => FUSION_LIBRARY_PATH . '/inc/class-fusion-product-registration.php',
'Fusion_Updater' => FUSION_LIBRARY_PATH . '/inc/class-fusion-updater.php',
'Fusion_WooCommerce' => FUSION_LIBRARY_PATH . '/inc/class-fusion-woocommerce.php',
'Fusion_Helper' => FUSION_LIBRARY_PATH . '/inc/class-fusion-helper.php',
'Fusion_Social_Icons' => FUSION_LIBRARY_PATH . '/inc/class-fusion-social-icons.php',
'Fusion_Dynamic_CSS' => FUSION_LIBRARY_PATH . '/inc/class-fusion-dynamic-css.php',
'Fusion_Dynamic_CSS_Helpers' => FUSION_LIBRARY_PATH . '/inc/class-fusion-dynamic-css-helpers.php',
'Fusion_Options_Map' => FUSION_LIBRARY_PATH . '/inc/class-fusion-options-map.php',
'Fusion_Color' => FUSION_LIBRARY_PATH . '/inc/class-fusion-color.php',
'Fusion_Data' => FUSION_LIBRARY_PATH . '/inc/class-fusion-data.php',
'Fusion_Patcher' => FUSION_LIBRARY_PATH . '/inc/class-fusion-patcher.php',
'Fusion_Patcher_Apply_Patch' => FUSION_LIBRARY_PATH . '/inc/class-fusion-patcher-apply-patch.php',
'Fusion_Patcher_Admin_Screen' => FUSION_LIBRARY_PATH . '/inc/class-fusion-patcher-admin-screen.php',
'Fusion_Patcher_Checker' => FUSION_LIBRARY_PATH . '/inc/class-fusion-patcher-checker.php',
'Fusion_Dynamic_CSS_Inline' => FUSION_LIBRARY_PATH . '/inc/class-fusion-dynamic-css-inline.php',
'Fusion_Dynamic_JS_File' => FUSION_LIBRARY_PATH . '/inc/class-fusion-dynamic-js-file.php',
'Fusion_Filesystem' => FUSION_LIBRARY_PATH . '/inc/class-fusion-filesystem.php',
'Fusion_Panel_Callbacks' => FUSION_LIBRARY_PATH . '/inc/class-fusion-panel-callbacks.php',
'Fusion_Featured_Image' => FUSION_LIBRARY_PATH . '/inc/class-fusion-featured-image.php',
'Fusion_Breadcrumbs' => FUSION_LIBRARY_PATH . '/inc/class-fusion-breadcrumbs.php',
'Fusion_Data_Framework' => FUSION_LIBRARY_PATH . '/inc/class-fusion-data-framework.php',
'Fusion_Data_PostMeta' => FUSION_LIBRARY_PATH . '/inc/class-fusion-data-postmeta.php',
'Fusion_FusionRedux' => FUSION_LIBRARY_PATH . '/inc/class-fusion-fusionredux.php',
'Fusion_Data_TermMeta' => FUSION_LIBRARY_PATH . '/inc/class-fusion-data-termmeta.php',
'Fusion_Dynamic_CSS_File' => FUSION_LIBRARY_PATH . '/inc/class-fusion-dynamic-css-file.php',
'Fusion_JSON_LD' => FUSION_LIBRARY_PATH . '/inc/class-fusion-json-ld.php',
];
}
return self::$path_map;
}
}