【问题标题】:PHP Late Static Binding UsePHP 后期静态绑定使用
【发布时间】:2019-01-16 05:51:47
【问题描述】:

我今天遇到了一些使用 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 关键字是否会造成任何伤害?

【问题讨论】:

    标签: php binding static


    【解决方案1】:

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

    使用后期绑定总是有代价的,但它不是 C++,你不会用低资源编写低级别的驱动程序。成本根本不会引起注意。但是,不使用静态可能会导致将来出现一些难以检测的错误。

    In PHP manual你还可以在 PHP 中找到关于后期绑定的有趣之处

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      相关资源
      最近更新 更多