不,不能通过钩子“初始化”或实例化类,不能直接。总是需要一些额外的代码(而且这不是一件理想的事情,因为你正在为自己打开一罐蠕虫。
以下是一种更好的方法:
class MyClass {
function __construct() {
add_action( \'admin_init\', [ $this, \'getStuffDone\' ] );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
当然,可以创建一个接口类来进一步简化一般情况下的接口类:
class IGetStuffDone {
function IGetStuffDone(){
add_action( \'admin_init\', [ $this, \'getStuffDone\' ] );
}
public abstract function getStuffDone();
}
请注意,作为接口,您不能直接创建这种类型的对象,但可以创建一个子类,可以这样说:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
这将自动添加所有挂钩,您只需定义子类中的具体操作,然后创建它!
On Constructors
我不会将构造函数添加为钩子函数,这是一种不好的做法,可能会导致很多不寻常的事件。此外,在大多数语言中,构造函数都会返回正在实例化的对象,因此,如果钩子需要返回类似于过滤器中的内容,它将不会返回所需的已过滤变量,而是返回class对象。
直接调用构造函数或析构函数是非常非常糟糕的编程实践,无论您使用哪种语言,也应该never 完成。
构造器还应该构造对象,以便初始化它们以供使用,而不是用于实际工作。对象要完成的工作应该在单独的函数中。
Static class methods, and not needing to instantiate/initialise at all
如果类方法是静态类方法,则可以在引号中传递类的名称,而不是
$this
如下所示:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( \'admin_init\', [ __NAMESPACE__ . \'\\MyClass\',\'getStuffDone\' ] );
注意使用
__NAMESPACE__
如果您的类位于命名空间内,则需要使用该名称。
Closures
遗憾的是,您无法避免创建新类的这一行。跳过它的唯一其他解决方案将涉及仍有该行的锅炉板代码,例如:
add_action( \'admin_init\', function() {
$var = new MyClass();
$var->getStuffDone();
} );
此时,您可以跳过该类,只使用函数:
add_action( \'admin_init\', function() {
// do stuff
} );
但请记住,您现在已经引入了匿名函数的幽灵。无法使用删除上述操作
remove_action
, 这可能而且确实会给那些不得不使用其他人代码的开发人员带来巨大的痛苦。
On Ampersands
您可能会看到这样使用的操作:
array( &$this, \'getStuffDone\' )
This is bad.
&
是在PHP 4中添加的,当时对象是作为值传递的,而不是作为引用传递的。PHP 4已有十多年的历史,WordPress已经很长时间不支持它了。
有no reason 使用&this
在添加挂钩和过滤器时,删除引用不会引起任何问题,甚至可能改善与PHP未来版本的兼容性
请改用此选项:
[ $this, \'getStuffDone\' ]