PHP后期静态绑定使用

时间:2018-08-08 21:00:32

标签: php binding static

我今天遇到了一些使用PHP的后期静态绑定的代码,而使用它的方式对我来说没有意义。后期静态绑定对我来说是一个新概念,因此我想尽力解决这个问题。

研究了Github Gist并阅读了Stack Overflow的这篇文章之后,我了解了后期静态绑定的用途以及使用它的原因。现在,我正在尝试将其应用于正在查看的代码,这对我来说没有任何意义。感觉static关键字的使用不正确。这或多或少是我不确定的代码:

<?php 
    class myClass
    {
        const MY_CONST = 'some string';

        public function getMyConst()
        {
            return static::MY_CONST;
        }
    }

    $c = new myClass();
    print_r($c->getMyConst());

假设我理解这个概念,那么后期静态绑定使您可以在静态上下文中引用孩子的const。因此,在代码中,我看到的是没有继承,也没有静态函数,因此在这种特殊用例中使用static关键字和self关键字有什么意义?另外,假设以不正确的方式使用了static关键字是否有任何伤害(或者可能与预期使用的目的不完全相同)?

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,使用$c::MY_CONSTself::MY_CONSTstatic::MY_CONSTmyClass:MY_CONST将具有相同的效果。但是看起来您的类并未声明为final且可以扩展,并且在扩展时,static关键字将使用后期绑定指向const。

使用后期绑定总是要付出代价的,但是它不是C ++,因此您不会在资源匮乏的底层上编写驱动程序。费用根本不会引起注意。但是,不使用静态可能会导致将来很难检测到错误。

In PHP manual,您还可以找到有关PHP后期绑定的有趣内容

  

最新的静态绑定通过存储最后一个“非转发调用”中命名的类来工作。在静态方法调用的情况下,这是显式命名的类(通常是::运算符左侧的类);如果是非静态方法调用,则为对象的类。

     

此功能被命名为“后期静态绑定”,同时考虑了内部视角。 “后期绑定”来自以下事实:static ::不会使用定义方法的类来解析,而是使用运行时信息来计算。