仅启动类的最新版本

时间:2015-12-01 作者:Bob Tolbert

我们有一个类,它是我们开发的几个插件所共有的。随着时间的推移,我们改进了类并添加了新函数,因此我们有了类变量,即类版本。

由于多个插件具有不同版本的此类,因此一个插件可能会启动该类的旧版本,因为它是首先加载的,而另一个可能需要新版本的插件不会启动它,因为它已经定义好了。

管理这种情况的最佳方法是什么,以便只声明类的最新版本&;发起

谢谢Bob

2 个回复
SO网友:Dave Romsey

CMB2 有一种巧妙的方法来处理同样的情况。它为第一个版本(9999)建立了一个高数字版本常量,并且在每个后续版本上,版本常量都会递减。版本号用于实例化主类的操作的优先级。这样可以确保加载库的最新版本。

来自CMB2init.php

if ( ! class_exists( \'CMB2_Bootstrap_212\', false ) ) {
    /**
     * Handles checking for and loading the newest version of CMB2
     *
     * @since  2.0.0
     *
     * @category  WordPress_Plugin
     * @package   CMB2
     * @author    WebDevStudios
     * @license   GPL-2.0+
     * @link      http://webdevstudios.com
     */
    class CMB2_Bootstrap_212 {
        /**
         * Current version number
         * @var   string
         * @since 1.0.0
         */
        const VERSION = \'2.1.2\';
        /**
         * Current version hook priority.
         * Will decrement with each release
         *
         * @var   int
         * @since 2.0.0
         */
        const PRIORITY = 9987;
        /**
         * Single instance of the CMB2_Bootstrap_212 object
         *
         * @var CMB2_Bootstrap_212
         */
        public static $single_instance = null;
        /**
         * Creates/returns the single instance CMB2_Bootstrap_212 object
         *
         * @since  2.0.0
         * @return CMB2_Bootstrap_212 Single instance object
         */
        public static function initiate() {
            if ( null === self::$single_instance ) {
                self::$single_instance = new self();
            }
            return self::$single_instance;
        }
        /**
         * Starts the version checking process.
         * Creates CMB2_LOADED definition for early detection by other scripts
         *
         * Hooks CMB2 inclusion to the init hook on a high priority which decrements
         * (increasing the priority) with each version release.
         *
         * @since 2.0.0
         */
        private function __construct() {
            /**
             * A constant you can use to check if CMB2 is loaded
             * for your plugins/themes with CMB2 dependency
             */
            if ( ! defined( \'CMB2_LOADED\' ) ) {
                define( \'CMB2_LOADED\', true );
            }
            add_action( \'init\', array( $this, \'include_cmb\' ), self::PRIORITY );
        }
        /**
         * A final check if CMB2 exists before kicking off our CMB2 loading.
         * CMB2_VERSION and CMB2_DIR constants are set at this point.
         *
         * @since  2.0.0
         */
        public function include_cmb() {
            if ( class_exists( \'CMB2\', false ) ) {
                return;
            }
            if ( ! defined( \'CMB2_VERSION\' ) ) {
                define( \'CMB2_VERSION\', self::VERSION );
            }
            if ( ! defined( \'CMB2_DIR\' ) ) {
                define( \'CMB2_DIR\', trailingslashit( dirname( __FILE__ ) ) );
            }
            $this->l10ni18n();
            // Include helper functions
            require_once \'includes/helper-functions.php\';
            // Now kick off the class autoloader
            spl_autoload_register( \'cmb2_autoload_classes\' );
            // Kick the whole thing off
            require_once \'bootstrap.php\';
        }

        /**
         * Registers CMB2 text domain path
         * @since  2.0.0
         */
        public function l10ni18n() {
            $loaded = load_plugin_textdomain( \'cmb2\', false, \'/languages/\' );
            if ( ! $loaded ) {
                $loaded = load_muplugin_textdomain( \'cmb2\', \'/languages/\' );
            }
            if ( ! $loaded ) {
                $loaded = load_theme_textdomain( \'cmb2\', get_stylesheet_directory() . \'/languages/\' );
            }
            if ( ! $loaded ) {
                $locale = apply_filters( \'plugin_locale\', get_locale(), \'cmb2\' );
                $mofile = dirname( __FILE__ ) . \'/languages/cmb2-\' . $locale . \'.mo\';
                load_textdomain( \'cmb2\', $mofile );
            }
        }
    }
    // Make it so...
    CMB2_Bootstrap_212::initiate();
}

SO网友:jdm2112

如果您使用的是版本控制(如Git),那么使用子模块似乎是对项目中的公共部分进行版本化的最佳方式。

然后,作为子模块的类将成为多个父插件的子类:https://git-scm.com/book/en/v2/Git-Tools-Submodules

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请