我在Wordpress插件中注册了操作的类方法。当我的方法被Wordpress调用时,如果我尝试使用$ this变量,那么php会抛出一个错误,指出对$ this变量的调用在对象上下文之外是非法的。
怎么会这样?我认为除非方法是静态的,否则你不应该在没有实例化类的情况下调用类方法!我的方法不是静态的!发生了什么事?
源代码
显然,从主插件文件调用初始化:
add_action('init', array('AffiliateMarketting', 'initialize'), 1);
我的班级看起来像这样:
class AffiliateMarketting
{
public function __construct()
{
// some initialization code
}
public function initialize()
{
add_action('woocommerce_before_single_product', array("AffiliateMarketting", "handleAffiliateReferral"));
}
public function handleAffiliateReferral($post)
{
$this->xxx(); // <---- offending function call
}
public function xxx()
{
}
}
收到的错误消息实际上是Fatal error: Using $this when not in object context in <filename> on line <linenumber>
。
答案 0 :(得分:4)
您必须首先实例化该类。像这样:
$affiliatemarketing = new AffiliateMarketing;
然后执行以下操作:
add_action('init', array(&$affiliatemarketing, 'initialize'), 1);
编辑:忘记添加,您的方法中的操作应该添加如下:
add_action('woocommerce_before_single_product', array(&$this, "handleAffiliateReferral"));
答案 1 :(得分:1)
你不应该这样。这就是你收到错误的原因。
我不确切知道你是如何注册这个方法的(代码会有所帮助),但是,你可能希望Wordpress能够负责创建一个实例,但这不是它的作用。
答案 2 :(得分:1)
我发现Codex documented如果使用字符串表示法指定了类名,那么add_action
函数将假定调用是静态方法。
另一方面,如果传递了类的实例,那么add_action
将使用该实例进行方法调用。
答案 3 :(得分:0)
虽然Arman没有指定他使用的是哪个php版本,但我认为它可能是5.3.2或5.3.3。错误本身与描述in this question的错误类似,解决方案也是升级到最新版本的php 5.3。