add_action()中$this的具体含义及数组回调的使用疑问
array($this, '方法名')作为回调? 这个问题问到点子上了!这其实是PHP面向对象编程规则和WordPress钩子机制结合的必然要求,咱们一步步拆解清楚:
1. $this在这里的核心作用
当你在类的内部写array($this, 'save_email')时,本质是给WordPress的钩子系统传递了一个绑定了实例的方法调用指令:
$this代表当前类的具体实例对象(也就是你通过new关键字创建出来的那个类实例)- 第二个元素
'save_email'是这个实例里要执行的方法名
简单说就是告诉WordPress:“等wp_loaded动作触发时,去调用我这个类实例里的save_email方法,别找错地方!”
2. 为什么不能直接写add_action('wp_loaded','save_email')?
你的save_email是类中的非静态成员方法,PHP的语法规则明确要求:这类方法必须依附于某个类的实例才能执行,不能像全局函数那样直接调用。
如果直接传字符串'save_email',WordPress执行钩子时会去全局作用域找一个叫save_email()的全局函数,但你的save_email是类里的方法,全局根本不存在这个函数,结果就是注册的动作完全不会触发,你的邮箱保存逻辑自然跑不起来。
结合你的邮件订阅例子再理解
看你写的save_email方法,哪怕它没用到类的其他属性(比如$this->some_property),只要它是类的非静态方法,就必须通过实例调用。用array($this, 'save_email')就是明确告诉PHP:“我要调用的是当前这个实例里的save_email方法,不是全局函数,也不是其他实例的方法”。
额外补充:静态方法的情况
如果你的save_email是静态方法(加了static关键字),那你可以用array('你的类名', 'save_email')或者'你的类名::save_email'来注册钩子,因为静态方法属于类本身,不需要依附于实例。但静态方法里不能用$this,这点要注意。
内容的提问来源于stack exchange,提问作者FitzChevalerie

