欧美激情中文字幕在线_国产区精品视频_免费久久99精品国产自_日韩精品 欧美

論WordPress的單例模式,和更好的初始化方法

WordPress中,插件使用單例模式,性能更好,免得資源浪費。

平時,以面向?qū)ο蟮膶懛ㄊ沁@樣的:

class Plugin
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        // Actions
        add_action('wp_enqueue_scripts', array($this, 'enqueue_script'));

        // Filters
        add_filter('the_content', array($this, 'the_content'));
    }

    /**
     * 一些方法
     */
    public function enqueue_script()
    {
        // ...
    }
}
$plugin = new Plugin();

或者,其他流行的方法是實例化一個對象類。在外部,使用該實例注冊你的動作和過濾器。

class Plugin
{

    public function enqueue_script()
    {
        // ...
    }

    public function the_content($content)
    {
        // ...

        return $content;
    }
}
$plugin = new WP_Kickass_Plugin();

// Actions
add_action('wp_enqueue_scripts', array($plugin, 'enqueue_script'));

// Filters
add_filter('the_content', array($plugin, 'the_content'));

這兩種方法都有一個問題,那就是沒有一種簡單的方法可以在之后將該對象取回,容易被覆蓋。當然了,名字可以盡量起得不一樣。

實際上,WordPress同樣可以使用單例模式,實現(xiàn)單例模式的類有三個元素。你必須:

  1. 有一個私有靜態(tài)變量來存儲實例化的對象。
  2. 將構造函數(shù)設為私有。
  3. 創(chuàng)建一個公共靜態(tài)方法(通常稱為“get_instance”)來獲取實例化的對象。

看一下前面的兩個例子。可以按照上述步驟將它們轉(zhuǎn)換為單例。生成的代碼與原始代碼非常接近。第一個示例使用構造函數(shù)注冊所有操作和過濾器,可以在下面看到轉(zhuǎn)換后的代碼。

class Plugin
{
   
    private static $instance;

    public static function get_instance()
    {
        if (null === self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Constructor.
     */
    private function __construct()
    {
        // Actions
        add_action('wp_enqueue_scripts', array($this, 'enqueue_script'));

        // Filters
        add_filter('the_content', array($this, 'the_content'));
    }

    /**
     *加載其他功能
     */
    public function enqueue_script()
    {
        // ...
    }

   
    public function the_content($content)
    {
        // ...

        return $content;
    }
}
$plugin = Plugin::get_instance();

將其轉(zhuǎn)換為單例需要進行一些更改。將構造函數(shù)設為私有,并添加了靜態(tài)變量和“get_instance”方法,結果與前面的示例幾乎相同。

同樣,可以放到外面來調(diào)用:

class Plugin
{

    private static $instance;


    public static function get_instance()
    {
        if (null === self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Constructor.
     */
    private function __construct()
    {
        // So ronery...
    }


    public function the_content($content)
    {
        // ...

        return $content;
    }
}

// Actions
add_action('wp_enqueue_scripts', array(Plugin::get_instance(), 'enqueue_script'));

// Filters
add_filter('the_content', array(Plugin::get_instance(), 'the_content'));

我們需要創(chuàng)建一個空的私有構造函數(shù)。這是因為默認情況下構造函數(shù)是公共的。私有構造函數(shù)的另一個副作用是我們不能使用new關鍵字創(chuàng)建對象。我們需要通過調(diào)用“get_instance”將其傳遞給寄存器函數(shù)。值得注意的是,單例使第二種方法的吸引力大大降低。如果在構造函數(shù)中注冊鉤子,那么單例模式更有趣。

從構造函數(shù)中初始化插件

構造函數(shù)的作用是準備對象以供使用,用插件API注冊操作和過濾器根本不適合這個任務。使用靜態(tài)方法創(chuàng)建對象并在那里注冊所有內(nèi)容顯然更好。

class Plugin
{
    /**
     * 注冊插件
     */
    public static function register()
    {
        $plugin = new self();

        // Actions
        add_action('wp_enqueue_scripts', array($plugin, 'enqueue_script'));

        // Filters
        add_filter('the_content', array($plugin, 'the_content'));
    }

    public function __construct()
    {
        // Setup your plugin object here
    }

    public function enqueue_script()
    {
        // ...
    }
}
Plugin::register();

這使WordPress代碼更加解耦。唯一的問題是,一旦對象注冊,就不能更改它。
構造函數(shù)現(xiàn)在也是公共的,沒有必要私有了。這意味著實例化一個新對象對WordPress不再有任何影響。
這些變化還有另一個積極的好處。可以進行類單元可測試。

將插件API拆分為自己的類,這是克服使用單例模式的更高級的方法,其思想是將插件API的使用與所有類分離。創(chuàng)建一個類,該類的唯一責任是與之交互。
這就是我在編寫使用接口的示例時想到的,創(chuàng)建該類就不需要在其他類中使用“add_action”和“add_filter”。我們在這里使用插件API,但是對于插件中非常依賴的任何API,都應該這樣做。
關于單例模式值得了解,也就是說,使用它是一種選擇,你不必這么做。對于你來說,有各種各樣的方法來回避單例模式解決的問題。

上一篇 Fancybox 和 lazyload 同時存在的問題
下一篇 WordPress 外鏈跳轉(zhuǎn)插件 v1.0.0
目錄
applek

applek管理員

個人說明在個人中心里面設置

本月創(chuàng)作熱力圖

最新評論
小超
小超
7月9日
下個版本考慮將下載地址加密(防止采集)
Lvtu
Lvtu
7月4日
qiang厲害
評論于留言建議
chinacnd
chinacnd
6月26日
這個主題是怎么做到加載速度那么快的?
風起云涌
風起云涌
6月17日
前臺投稿現(xiàn)在有點太抽象了 希望可以弄成那種分區(qū)填寫的 標題,內(nèi)容,圖片,目錄,標簽,這樣的
評論于留言建議
主站蜘蛛池模板: 国产精品成av人在线视午夜片| 91精品国自产在线观看| 亚洲综合五月天| 亚洲一二区在线| 欧美日本在线视频中文字字幕| 久久黄色av网站| 日韩亚洲成人av在线| 亚洲午夜高清视频| www黄色在线| av免费观看网| 国产精品久久久av| 国产国产精品人在线视| 九色91视频| 九九精品视频在线| 久久在线免费观看视频| 日韩av成人在线| 97国产精品视频| 亚洲中文字幕无码专区| 久久在线免费观看视频| 久久亚洲高清| 日本一区二区久久精品| 免费一级特黄毛片| 国产在线观看不卡| 国产精品福利视频| 人妻av无码专区| 欧美极品第一页| 国产精品美女主播在线观看纯欲| 懂色av一区二区三区四区五区| 欧美亚洲日本黄色| 99久久久精品免费观看国产| 国产精品久久久久久久久婷婷| 777国产偷窥盗摄精品视频| 午夜精品三级视频福利| 国产精品精品一区二区三区午夜版 | 久久99精品久久久久子伦| 日本久久亚洲电影| 久久精品99久久| 日本一区二区三区视频免费看 | 国产一区高清视频| 草莓视频一区| 欧美精品中文字幕一区二区|