美文网首页
PHP 静态方式调用非静态方法的一些说明

PHP 静态方式调用非静态方法的一些说明

作者: 张小刀 | 来源:发表于2017-03-19 16:36 被阅读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. 当你的函数名和类名相同时,那就是另一种情况了,不在本文的讨论范围中。

    相关文章

      网友评论

          本文标题:PHP 静态方式调用非静态方法的一些说明

          本文链接:https://www.haomeiwen.com/subject/kgnmnttx.html