問題描述

在’add_action’ 中可以引用一個類而不是一個函式嗎?似乎沒有弄清楚。這裡只是一個功能的基本例子。

add_action( 'admin_init', 'MyClass' );
class MyClass {
     function __construct() {
          .. This is where stuff gets done ..
     }
}

那麼是的,這不行。我也試過:

$var = new MyClass();
add_action( 'admin_init', array( &$var ) );

和:

$var = new MyClass();
add_action( 'admin_init', array( &$var, '__construct' ) );

並且:

add_action( 'admin_init', 'MyClass::__construct' );

有沒有我可以做到這一點,而不必建立一個單獨的函式載入類?我想要透過 add_action 執行類建構函式。所有這些都需要載入才能讓球滾動。

最佳解決方案

不,你不能’initialise’ 或透過鉤子例項化類,而不是直接。總是需要一些額外的程式碼 (並不是一件可取的事情,因為你為自己開啟一個蠕蟲病毒。

這是一個更好的方法:

class MyClass {
     function __construct() {
          add_action( 'admin_init',array( $this, 'getStuffDone' ) );
     }
     function getStuffDone() {
          // .. This is where stuff gets done ..
     }
}
$var = new MyClass();

當然,可以建立一個介面類,以便在一般情況下進一步簡化它:

class IGetStuffDone {
    function IGetStuffDone(){
        add_action( 'admin_init',array( $this, 'getStuffDone' ) );
    }
    public abstract function getStuffDone();
}

請注意,作為介面,您無法直接建立此型別的物件,但您可以建立一個 sub-class,讓您說:

class CDoingThings extends IGetStuffDone {
    function getStuffDone(){
        // doing things
    }
}
$var = new CDoingThings();

然後,它將自動新增所有的鉤子,您只需要定義在子類中完成的是什麼,然後建立它!

在建構函式上

我不會新增一個建構函式作為一個鉤子函式,這是不好的做法,可以導致很多不尋常的事件。同樣在大多數語言中,建構函式返回正在例項化的物件,因此如果您的鉤子需要返回類似過濾器的內容,則不會返回過濾的變數,而是返回類物件。

呼叫建構函式或解構函式是非常非常糟糕的程式設計實踐,無論你使用哪種語言,都不應該做。

建構函式還應該構造物件,以便初始化它們可以使用,而不是實際工作。由物件完成的工作應該在一個單獨的函式中。

靜態類方法,而不需要例項化/初始化

如果您的類方法是靜態類方法,則可以使用引號將該類的名稱傳遞給 $this,如下所示:

class MyClass {
     public static function getStuffDone() {
          // .. This is where stuff gets done ..
     }
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );

關閉& PHP 5.3

可悲的是,您無法避免建立新課程的線條。跳過它的唯一其他解決方案將涉及仍然具有該行的鍋爐程式碼,並且需要 PHP 5.3+,例如:

add_action('admin_init',function(){
    $var = new MyClass();
    $var->getStuffDone();
});

在這一點上,您也可以跳過課程,只需使用一個函式:

add_action('admin_init',function(){
    // do stuff
});

但請記住,您現在已經介紹了匿名功能的幽靈。沒有辦法使用 remove_action 刪除上述操作,這對於必須與其他人員程式碼一起工作的開發人員來說,這可能會確實造成很大的痛苦。

在& 符號

您可能會看到如下所示的操作:

add_action( &$this, 'getStuffDone' );

這不好。當物件作為值傳遞時,& 被新增回 PHP 4,而不是引用。 PHP 4 已經十多年了,並且 WordPress 在很長一段時間內都沒有得到支援,當新增鉤子和過濾器時,沒有任何理由使用&this

次佳解決方案

示例類

筆記:

  • 初始化類一次

    • 呼叫優先順序為 0,所以稍後可以使用預設優先順序相同的鉤子

    • 將其包裝在! class_exists 中,以避免呼叫它兩次,並將 init 呼叫者放在

  • 使 init 功能和類 var static

  • 當您呼叫 new self 類時,從 init 內部呼叫建構函式。

這是一個例子

if ( ! class_exists( 'WPSESampleClass' ) )
{
    // Init the class on priority 0 to avoid adding priority inside the class as default = 10
    add_action( 'init', array ( 'WPSESampleClass', 'init' ), 0 );

class WPSESampleClass
{
    /**
     * The Class Object
     */
    static private $class = null;

    public static function init()
    {
        if ( null === self::$class )
            self :: $class = new self;

        return self :: $class;
    }

    public function __construct()
    {
        // do stuff like add action calls:
        add_action( 'init', array( $this, 'cb_fn_name' ) );
    }

    public function cb_fn_name()
    {
        // do stuff
    }
} // END Class WPSESampleClass

} // endif;

Php 5+

請離開& 。我們已經超越了 php4 。 🙂

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。