php可以在不首先实例化类的情况下调用非静态方法


Can php call non static method without instantiating the class first?

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

您必须首先实例化类。类似这样的东西:

$affiliatemarketing = new AffiliateMarketing;

然后执行以下操作:

add_action('init', array(&$affiliatemarketing, 'initialize'), 1);

编辑:忘记添加,你在方法中的操作应该这样添加:

add_action('woocommerce_before_single_product', array(&$this, "handleAffiliateReferral"));

你不应该是。这就是为什么你会得到一个错误。

我不知道你是如何注册这个方法的(代码会有所帮助),但你可能希望Wordpress负责创建一个实例,但这不是它的职责。

我发现Codex记录了如果使用字符串表示指定类名,那么add_action函数将假设调用是对静态方法的。

另一方面,如果传递了类的一个实例,则add_action将使用该实例进行方法调用。

虽然Arman没有指定他使用的php版本,但我认为可能是5.3.2或5.3.3。错误本身与本问题中描述的错误非常相似,解决方案也是升级到php5.3的最新版本。