为什么使用 class 和 public 方法的操作不会触发 __construct()

Why do actions with class and public method don't fire __construct()

我正在尝试了解 WordPress 如何处理操作、classes 和方法。

如果有一个class“TestClass”并且它有一个public方法'method1'

该方法可以挂接到任何操作,如“add_action('theHook', ['TestClass', 'method1']);”

据我了解。如果不初始化 class,则无法访问其 public 方法和对象。现在,我假设 WordPress 必须遵循这一点,并且它必须初始化我的“TestClass”,这将导致 public __construct() 触发。

然而,在测试之后,它不会触发 __construct()..

这是为什么?我知道一个修复方法是在 'method1' 内部进行自我初始化,但我想弄清楚为什么 WordPress 会这样。

因为 WordPress 将您的方法作为静态函数调用:TestClass::method()

有多种解决方案:

1。在添加 Action

之前初始化 class

在添加操作之前初始化您的 class,例如:

$test = new TestClass();
add_action('hook', [$test, 'method']);

2。在你的 Class:

中调用 hook
class TestClass {
    public function __construct() {
        // Your construct
    }
    public function method() {
        // Your Method
    }

    public function call_hook() {
        add_action('hook', [$this, 'method']);
    }
}

$test = new TestClass();
$test->call_hook();

3。使用单例

如果您只需要 class 的一个实例并在不同的地方调用它,您必须查看 Singleton design pattern

示范:

class MySingletonClass {

    private static $__instance = null;
    private $count = 0;
    private function __construct() {
        // construct
    }

    public static function getInstance() {
        if (is_null(self::$__instance)) {
            self::$__instance = new MySingletonClass();
        }
        return self::$__instance;
    }

    public function method() {
        $this->count += 1;
        error_log("count:".$this->count);
    }
}

$singleton = MySingletonClass::getInstance();
add_action('wp_head', [$singleton, 'method']);


$singleton2 = MySingletonClass::getInstance();
add_action('wp_footer', [$singleton2, 'method']);