zoukankan      html  css  js  c++  java
  • php中的后期静态绑定("Late Static Binding")

    在我们以往中,在类中使用self关键字的时候都是指向了被调用方法定义时的类,而非原始的调用类。

    例如:

    class Animal{
      static $IQ_lv_avg = 1;
      public static function myiqlvavg(){
        echo self::$IQ_lv_avg.PHP_EOL;
      }
      public static function test(){
        self::myiqlvavg();
      }
    
    }
    
    class Dog extends Animal{
      static $IQ_lv_avg = 3;
      public static function myiqlvavg(){
        echo self::$IQ_lv_avg.PHP_EOL;
      }
    
    }
    
    Dog::test();//echo 1

    我们可以得到最后得到的平均IQ等级是1

    self指向的是定义其所在方法的类。

    我们如果想执行Dog类,也就是调用类的静态方法怎么办呢?

    静态后期绑定可以做到。

    使用方法其实就是使用static关键字。

    例如:

    class GrandparentClass{
    
      static $age = 40;
      public static function foo(){
        static::whatMyAge();
    }
    
      public static function whatMyAge(){
        echo __CLASS__.PHP_EOL;
      }
    }
    
    class ParentClass extends GrandparentClass{
    
         static $age = 60;
      public static function start(){
        GrandparentClass::foo();
        parent::foo();
        self::foo();
      }
    }
    
    class ChildrenClass extends ParentClass{
    
    static $age = 90;
      public static function whatMyAge(){
        echo __CLASS__.PHP_EOL;
      }
    }
    ChildrenClass::start();

    最终获得的年代为:

    40 90 90

    在静态方法中,我们可以使用get_called_class()函数得知调用静态方法的类名。

    例如:

    class foo {
        static public function test() {
            var_dump(get_called_class());
        }
    }
    
    class bar extends foo {
    }
    
    foo::test();//echo foo
    bar::test();//echo bar

    在php 5.5之后可以使用static::class 达到get_called_class()同效果。

    Note:可以直接调用phpversion函数查看当前php版本,或者cli模式查看,总之方法多多。

    Praise the sun.
  • 相关阅读:
    页面打印
    scala
    IntelliJ Idea 常用快捷键列表
    flume
    spring事务管理方式,aop
    oldboy es和logstash
    elasticsearch视频34季
    elasticsearch视频
    python3
    git
  • 原文地址:https://www.cnblogs.com/xzysaber/p/4675353.html
Copyright © 2011-2022 走看看