将类对象方法挂钩到操作

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)
      }
    }