將類物件方法掛鉤到操作

PHP 類是改進程式碼組織和最小化命名衝突的強大工具。在某些時候,不可避免地會出現如何為類方法建立動作鉤子的問題。

$function_to_add 引數通常顯示為包含函式名稱的字串,但引數的資料型別實際上是“ 可呼叫的 ”,對於我們的目的,可以將其概括為對函式或方法的引用

有許多可呼叫的格式可用於引用類和物件的方法。但是,在所有情況下,引用的方法必須是公開可見的 。如果方法以 public 關鍵字為字首,或者根本沒有可見性關鍵字(在這種情況下方法預設為 public),則該方法是公共的。

物件方法操作掛鉤

物件方法在類的特定例項上執行。

class My_Class {
  // Constructor
  function My_Class() {
    // (Instantiation logic)
  }

  // Initialization function
  public function initialize() {
    // (Initialization logic)
  }
}

在例項化上述類之後,如下所示,

$my_class_instance = new My_Class();

通常通過呼叫 $my_class_instance->initialize(); 在物件上呼叫 initialize() 方法。將方法掛鉤到'init' WordPress 操作是通過傳遞包含對例項的引用的陣列和包含物件方法名稱的字串來完成的:

add_action( 'init', [ $my_class_instance, 'initialize' ] );

如果在物件方法中呼叫 add_action(),也可以使用 $this 偽變數:

class My_Class {
  // Constructor
  function My_Class() {
    // (Instantiation logic)
    add_action( 'init', [ $this, 'initialize' ] );
  }

  // Initialization function
  public function initialize() {
    // (Initialization logic)
  }
}

類方法操作掛鉤

類方法是靜態地在類而不是任何特定例項上執行的。鑑於以下類,

class My_Class {   
  // Initialization function
  public static function initialize() {
    // (Initialization logic)
  }
}

通常使用::範圍解析運算子(即 My_Class::initialize();)來呼叫 initialize() 方法。將靜態類方法掛鉤到 WordPress 可以通過幾種不同的方式完成:

  • 使用由包含類名的字串和包含方法名的字串組成的陣列:

    add_action( 'init', [ 'My_Class', 'initialize' ] );
    
  • 傳遞包含方法的完整引用的字串,包括::運算子:

    add_action( 'init', 'My_Class::initialize' );
    
  • 如果在靜態類方法中呼叫 add_action(),則可以使用 self 關鍵字或 __CLASS__ 魔術常量來代替類名。請注意,這通常是不可取的,因為這些項的值在類繼承的情況下變得有些違反直覺。

    class My_Class {
      // Setup function
      public static function setup_actions() {
        add_action( 'init', 'self::initialize' );
      }
    
      // Initialization function
      public static function initialize() {
        // (Initialization logic)
      }
    }