为什么使用 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']);
我正在尝试了解 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:
中调用 hookclass 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']);