【问题标题】:Can php call non static method without instantiating the class first?php可以在不先实例化类的情况下调用非静态方法吗?
【发布时间】:2012-02-01 12:24:21
【问题描述】:

我在我的 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 &lt;filename&gt; on line &lt;linenumber&gt;

【问题讨论】:

  • 你使用的是什么版本的 PHP?
  • 错误信息是Fatal error: Using $this when not in object context in &lt;filename&gt; on line &lt;linenumber&gt;?那么 上的代码不在类方法中。向我们展示有问题的代码。
  • @VolkerK 我用一些代码更新了问题
  • hm,那么 Arjan 就有趣了。当我对非静态方法进行静态调用时,php 会引发更具体的错误消息:“PHP 严格标准:不应静态调用非静态方法 Foo::bar()”。

标签: php wordpress


【解决方案1】:

您必须先实例化该类。像这样的:

$affiliatemarketing = new AffiliateMarketing;

然后执行以下操作:

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

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

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

【讨论】:

    【解决方案2】:

    你不应该这样。这就是您收到错误消息的原因。

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

    【讨论】:

    • 您不能在非对象上调用方法。这会产生另一个错误。如果消息是 $this 不是对象,则在调用该方法时存在对象。
    【解决方案3】:

    我发现 Codex documented 如果使用其字符串表示指定类名,则 add_action 函数将假定调用是静态方法。

    另一方面,如果类的实例被传递,那么add_action 将使用该实例进行方法调用。

    【讨论】:

      【解决方案4】:

      虽然 Arman 没有具体说明他使用的是哪个 php 版本,但我认为它可能是 5.3.2 或 5.3.3。错误本身与in this question 描述的错误非常相似,解决方案也是升级到最新版本的php 5.3。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 2022-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        相关资源
        最近更新 更多