0

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

'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();

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

4

3 回答 3

3

该通知告诉您不应在静态方法中调用非静态方法。

您可以检查方法i(),如果$this没有出现在该方法中,您可以考虑更改i()为静态方法。

于 2013-04-15T03:07:54.720 回答
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();

这是一个严格的警告——这意味着如果你愿意,你可以选择忽略它——但它告诉你,你所做的通常不是好的做法,你可能应该重新考虑你的方法。

于 2013-04-15T03:11:31.170 回答
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();
于 2013-04-15T03:11:57.800 回答