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 的一部分

特别说明:

  1. 本文只是浅显的说明了一些相关现象和历史演变,如果想了解更深入的语言设计和源码实现(涉及到calling scope),请自行Google。
  2. 当你的函数名和类名相同时,那就是另一种情况了,不在本文的讨论范围中。
上一篇下一篇

猜你喜欢

热点阅读