php可以调用非静态方法而不首先实例化该类吗?

时间:2012-01-31 07:57:49

标签: php wordpress wordpress-plugin

我在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>

4 个答案:

答案 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。