php范围解析运算符

时间:2013-04-15 02:57:55

标签: php oop

为什么这会返回“严格标准”通知?:

'Strict Standards: Non-static method main::i() should not be called statically in...'


class main
{
    public function __construct()
    {
        echo "in main class";
    }
    public function i()
    {
        echo "i in main";
    }
}

class secondary extends main
{
    public static function tom()
    {
        parent::i();
    }
}

secondary::tom();

我在合法地调用一个静态方法,该方法包含对父类中非静态方法的调用。

3 个答案:

答案 0 :(得分:3)

通知告诉你不要在静态方法中调用非静态方法。

您可以检查方法i(),如果该方法中未显示$this,您可以考虑将i()更改为静态方法。

答案 1 :(得分:0)

您已经自己回答了这个问题 - 当您静态调用tom()时(这很好),i()不是静态的。

非静态i()假定您拥有该对象的实例,因此可能尝试访问属性或执行需要实例的其他操作。因此,它不应该静态调用,甚至不能在子类的静态方法中调用。例如,考虑对您的代码进行以下微小更改:

class main
{
    var something = 0;
    public function __construct()
    {
        echo "in main class";
    }
    public function i()
    {
        $this->something++;
        echo "i in main";
    }
}

class secondary extends main
{
    public static function tom()
    {
        parent::i();
    }
}

secondary::tom();

这是一个严格的警告 - 意味着如果你愿意,你可以选择忽略它 - 但是它告诉你,你正在做的事情通常不是好的做法,你应该重新思考你的做法。

答案 2 :(得分:0)

class main
{
    public function __construct()
    {
        echo "in main class";
    }
    public static function i()
    {
        echo "i in main";
    }
}

class secondary extends main
{
    public static function tom()
    {
        parent::i();
    }
}

secondary::tom();

应该是什么样子,请注意我已将函数i();转换为静态函数,然后parent::i();

可以合法地调用它

但表演:

 public static function tom()
    {
        $this->i();
    }

将返回:

  

致命错误:不在对象上下文中时使用$ this

所以你的赌注是完全静止,或者不是静态的。

决议:

class main
{
    public function __construct()
    {
        echo "in main class";
    }
    public function i()
    {
        echo "i in main";
    }
}

class secondary extends main
{
    public function tom()
    {
        $this->i();
    }
}

$Class = new secondary();
$Class->tom();