不,您不能通过挂钩而不是直接“初始化”或实例化该类。总是需要一些其他代码(能够做到这一点并不是可取的,因为您正在为自己打开一罐蠕虫。
这是一种更好的方法:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
当然,可以创建一个接口类来简化一般情况下的接口类:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
请注意,作为接口,您不能直接创建此类型的对象,但是可以创建一个子类,让您说:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
然后,它将自动添加所有钩子,您只需要定义子类中正在执行的操作,然后创建它即可!
论构造函数
我不会将构造函数添加为钩子函数,这是不好的做法,并且可能导致许多异常事件。同样,在大多数语言中,构造函数会返回要实例化的对象,因此,如果您的钩子需要返回类似过滤器中的内容,它将不会返回您想要的已过滤变量,而是将返回类对象。
无论您使用的是哪种语言,调用构造函数或析构函数都是非常非常非常糟糕的编程习惯,绝不应该这样做。
构造函数还应该构造对象,以初始化它们以备使用,而不是用于实际工作。对象要完成的工作应该在单独的函数中。
静态类方法,完全不需要实例化/初始化
如果您的类方法是静态类方法,则可以用引号而不是$this
如下所示传递类的名称:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
闭包和PHP 5.3
可悲的是,您无法避免创建新类的行。跳过它的唯一其他解决方案将涉及仍然具有该行的样板代码,并且需要PHP 5.3+,例如:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
此时,您最好跳过该类,而只需使用一个函数:
add_action('admin_init',function(){
// do stuff
});
但是请记住,您现在已经介绍了匿名函数的幽灵。无法使用来删除上述操作remove_action
,这可能并且确实给必须使用其他人的代码的开发人员带来极大的痛苦。
在&符上
您可能会看到这样使用的操作:
array( &$this, 'getStuffDone' );
这不好。&
是在PHP 4中将对象作为值而不是作为引用传递回去的。PHP 4已经有十多年的历史了,并且很长一段时间以来一直不受WordPress支持。
有没有理由使用&this
添加时钩子和过滤器,除去基准会引起任何问题,甚至可能改善与PHP的未来版本的兼容性
使用此代替:
array( $this, 'getStuffDone' );