在PHP中用类中的双冒号调用它后将方法更改为static

时间:2011-01-09 21:24:28

标签: php class

我有一段代码:

class example {
    public function say($x) {
        if ($x > 0) {
            echo $x;
            $this->say($x - 1);
        }
        else echo "0<br>\n";
    }
}

example::say(5);

打电话给我:

 5
 Fatal error: Using $this when not in object context in (...).php on line 5

为什么会这样?功能'说'发生了什么?我看到它从一个类外面被调用一次,但为什么PHP内部声称“说”不能通过'$ this-&gt;'访问?

3 个答案:

答案 0 :(得分:4)

错误消息实际上非常清楚:您不能使用$ this,因为您从未创建过示例类的实例。如果要静态调用方法,请使用:

class example {
    public static function say($x) {
        if ($x > 0) {
           echo $x;
           self::say($x - 1); // static call
       }
       else {
           echo "0<br>\n";
       }
   }
}

example::say(5);

或以更面向对象的方式:

class example {
    public function say($x) {
        if ($x > 0) {
           echo $x;
           $this->say($x - 1);
       }
       else {
           echo "0<br>\n";
       }
   }
}

$x = new example();
$x->say(5);

可以静态地调用非静态方法,但不应该(这只有在方法不使用$ this时才有效)。这就是为什么PHP会在启用E_STRICT时警告您的原因

答案 1 :(得分:2)

使用self::say()example::say()。如果您在对象上下文中(即,您有一个使用$this实例化的示例对象),则应使用new

答案 2 :(得分:0)

您需要使用Scope Resolution Operator(::)来访问类中的静态方法。因此,将第5行更改为阅读......

example::say($x - 1);

(你也可以使用self:say来达到同样的效果。)