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

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

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

平時(shí),以面向?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();

或者,其他流行的方法是實(shí)例化一個(gè)對象類。在外部,使用該實(shí)例注冊你的動(dòng)作和過濾器。

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'));

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

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

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

看一下前面的兩個(gè)例子。可以按照上述步驟將它們轉(zhuǎn)換為單例。生成的代碼與原始代碼非常接近。第一個(gè)示例使用構(gòu)造函數(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)換為單例需要進(jìn)行一些更改。將構(gòu)造函數(shù)設(shè)為私有,并添加了靜態(tài)變量和“get_instance”方法,結(jié)果與前面的示例幾乎相同。

同樣,可以放到外面來調(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'));

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

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

構(gòu)造函數(shù)的作用是準(zhǔn)備對象以供使用,用插件API注冊操作和過濾器根本不適合這個(gè)任務(wù)。使用靜態(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代碼更加解耦。唯一的問題是,一旦對象注冊,就不能更改它。
構(gòu)造函數(shù)現(xiàn)在也是公共的,沒有必要私有了。這意味著實(shí)例化一個(gè)新對象對WordPress不再有任何影響。
這些變化還有另一個(gè)積極的好處。可以進(jìn)行類單元可測試。

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

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

applek管理員

個(gè)人說明在個(gè)人中心里面設(shè)置

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

最新評論
小超
小超
7月9日
下個(gè)版本考慮將下載地址加密(防止采集)
Lvtu
Lvtu
7月4日
qiang厲害
評論于留言建議
chinacnd
chinacnd
6月26日
這個(gè)主題是怎么做到加載速度那么快的?
風(fēng)起云涌
風(fēng)起云涌
6月17日
前臺(tái)投稿現(xiàn)在有點(diǎn)太抽象了 希望可以弄成那種分區(qū)填寫的 標(biāo)題,內(nèi)容,圖片,目錄,標(biāo)簽,這樣的
評論于留言建議
主站蜘蛛池模板: 日韩中文字幕在线视频播放| 欧美xxxx综合视频| 国产欧美一区二区三区久久| 国产精品美女诱惑| 日韩aⅴ视频一区二区三区| 国产亚洲精品自在久久| 亚洲精品日韩av| 国产精品美腿一区在线看| 日本视频一区二区在线观看| 一区二区视频在线免费| www.亚洲一区| 国产九九九九九| 精品中文字幕乱| 久久99影院| 久久国产精品视频| 久久手机精品视频| 欧美极品第一页| 欧美专区国产专区| 欧美中日韩免费视频| 日本视频一区在线观看| 午夜精品视频在线观看一区二区| 国产精品高潮视频| 国产精品99一区| 国产www精品| 97碰在线观看| 国产福利精品在线| 国产精品久久91| 国产福利久久精品| 91精品国产91久久久久久久久 | 欧美综合激情| 免费观看亚洲视频| 久久精品.com| 精品中文字幕乱| 国产精品免费福利| 97精品国产97久久久久久免费| 777国产偷窥盗摄精品视频| 日韩中文字幕二区| 欧美日韩精品免费在线观看视频| 欧美激情一级精品国产| 国产亚洲精品自在久久| 国产成人一区三区|