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