[英]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.