PHP 静态方式调用非静态方法的一些说明
2017-03-19 本文已影响91人
张小刀
请看下边一段代码,以大家的理解,运行下边的代码会出现什么输出呢?
<?php
class MyClass
{
public function test()
{
echo "this is not a static function.\n";
}
}
MyClass::test();
这段代码是一个很明显的静态方式调用非静态方法的例子,一般我们都会认为这样写的话,运行时肯定会报错的,但其实不然,PHP 其实是允许这么写的,但是大家都知道这样写明显是有问题的,所以在新一点的 PHP 版本中,官方也不再建议这么写,给出了一个E_STRICT
的警告。
具体情况如下:
在 PHP 5 之前这样写是不会报错的。
在 PHP 5 之后,官方引入了 E_STRICT
错误类型,对此官方的说明是启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性
,所以此时再用上边的写法,运行时是会有错误警告的。
所以我强烈建议大家避免这种写法,虽然语言层面可能允许你这么做,但是这是因为历史原因,语言无法做太大的革新,只能给以建议和警告。
可能有的同学会说『我用的版本高于PHP 5, 但是也没有报错提示啊』,这种情况下大家就需要去php.ini
里检查一下自己的error_reporting
配置项是否配置了E_STRICT
,调整一下相关参数即可。
特别提示一下,在添加了
E_STRICT
错误类型之后,5.X 几个小版本的更新中,预定义的错误类型也是有一定的变更的,如下:
版本 | 说明 |
---|---|
5.0.0 | 引入 E_STRICT (但不包括在 E_ALL 之内)。 |
5.2.0 | 引入 E_RECOVERABLE_ERROR。 |
5.3.0 | 引入 E_DEPRECATED 和 E_USER_DEPRECATED。 |
5.4.0 | E_STRICT 成为 E_ALL 的一部分 |
特别说明:
- 本文只是浅显的说明了一些相关现象和历史演变,如果想了解更深入的语言设计和源码实现(涉及到
calling scope
),请自行Google。- 当你的函数名和类名相同时,那就是另一种情况了,不在本文的讨论范围中。