zoukankan      html  css  js  c++  java
  • PHP "延迟静态绑定" 功能,static

    从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法。
    第二点延迟绑定,这个根据下面代码就可以很好的理解

    看一下这个例子:

    class A{
        static $name = "Tom";
        public function printName(){
            echo self::$name."
    ";
            self::fun();
        }
        static function fun(){
            echo "A Class
    ";
        }
    }
    class B extends A{
        static $name = "Jon";
        static function fun(){
            echo "B Class
    ";
        }
    }
    $obj = new B();
    $obj->printName();
    // 输出结果
    // Tom
    // A Class


    我在printName函数里面使用了self关键字,self是指向当前类的"指针",
    所以很多人会理想的认为输出结果会是这样:

    // Join
    // B Class


    是这样的,在定义A类的是时候,在函数printName里面使用self关键字调用了静态方法或属性,
    但是这个函数一旦定义好,A类的静态方法和属性就被绑定到函数了,不要去追究为什么,php就是这么实现的,
    但是我们现在要实现这样的效果,就是函数定义好后里面使用到的静态方法和属性不要立即绑定死,
    而是根据最终继承的类来确定绑定。
    所以php在5.5以后使用了static关键字来解决这个问题,解决后的代码例子如下:

    class A{
        static $name = "Tom";
        public function printName(){
            echo static::$name."
    ";
            static::fun();
        }
        static function fun(){
            echo "A Class
    ";
        }
    }
    class B extends A{
        static $name = "Jon";
        static function fun(){
            echo "B Class
    ";
        }
    }
    $obj = new B();
    $obj->printName();
    // 输出结果
    // Join
    // B Class



    大家可以在项目中自行挖掘使用场景,比如一个会员父类  class Vip
    下面两个子类分别是 超级会员 svip 和 年费会员 yvip
    可以在两个子类中分别重写 static usergroup() 方法 或者其他静态属性 ,父类中使用延迟静态绑定
    这样可以写出很优雅的代码

  • 相关阅读:
    聊聊LiteOS事件模块的结构体、初始化及常用操作
    有了这个数据强一致“利器”,DBA们轻松修复数据对加班“say no”
    开源一周岁,MindSpore新特性巨量来袭
    90后就敢当扫地僧!不服?4月24号来闯龙门阵!
    你的数仓函数结果不稳定,可能是属性指定错了
    云小课 | 不了解EIP带宽计费规则?看这里!
    腾讯 angel 3.0:高效处理模型
    深度树匹配模型(TDM)
    X-Deep Learning功能模块
    XLearning
  • 原文地址:https://www.cnblogs.com/codeAB/p/5560631.html
Copyright © 2011-2022 走看看