为什么这会返回“严格标准”通知?:
'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();
我在合法地调用一个静态方法,该方法包含对父类中非静态方法的调用。
答案 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();