繁体   English   中英

PHP范围解析运算符

[英]php scope resolution operator

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

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

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

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

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

您已经亲自回答了这个问题-在您静态调用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();

这是一个严格的警告-表示您可以选择忽略它-但这是在通知您您所做的通常不是很好的做法,您应该重新考虑自己的做法。

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();合法地调用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM