我有以下代码:
class A {
public function methodB()
{
// do something
return 1;
}
}
$a = A::methodB();
它应该永远不会奏效 它适用于那台机器!它确实返回1.真的,我发誓我没有喝醉。
当然,如果我在我的机器或生产服务器上运行它,它就不会工作。 因为你不能像静态一样调用非静态方法。应始终首先实例化类。
我很担心。想到今天,当我设置一个单独的工作机器来测试项目时,我再次获得了这个代码的环境。
事情变得更糟 - 我的团队中的开发人员仍然没有清楚地了解静态和非静态方法之间的差异。结果他们有代码在他们的机器上工作正常,但它在任何其他环境中失败。
为什么有效?我希望这样的代码失败。它不应该工作。
其运作的机器配置如下:
vagrant @ vagrant-ubuntu-trusty-32:/ var / www / apotheke $ php -v PHP 5.6.17-3 + deb.sury.org~trusty + 1(cli)Copyright(c)1997-2015 PHP Group Zend Engine v2.6.0,Copyright(c)1998-2015 Zend Technologies Zend Technologies的Zend OPcache v7.0.6-dev,Copyright(c)1999-2015,
真的,我觉得很蠢。 我错过了什么吗?
答案 0 :(得分:4)
以上代码在PHP 5中有效。From the docs:
在PHP 5中,静态调用非静态方法会生成
E_STRICT
级警告。
如果您启用严格错误报告,则会输出以下警告:
PHP严格标准:非静态方法A :: methodB()不应在第1行的php shell代码中静态调用
请注意,该方法仍会运行并返回一个值。
它在PHP 7中已弃用,不建议使用。
在PHP 7中,不推荐静态调用非静态方法,并将生成
E_DEPRECATED
警告。将来可能会删除对静态调用非静态方法的支持。
答案 1 :(得分:2)
您收到以下警告:
严格的标准:不应该调用非静态方法A :: methodB() 静态
但PHP假设你想要运行它,所以执行它。
要防止它,您可以将方法更改为:
class A {
public function methodB(){
if(isset($this)){
// do something
return 1;
}
}
}
无论如何都会抛出E_STRICT
错误(你可以禁用它),但PHP不会认为你打算运行它。