• PHP静态延迟绑定


    静态延迟绑定的概念

    PHP版本5.3起增加了静态延迟绑定,也称迟绑定,主要用于在继承范围内引用静态调用的类。简单地来说:static::不再被解析为当前方法所定义的类,而是在实际运行时计算的。

    // 意外的继承
    class Person 
    {
    	public static $name = 'Person';
    	
    	public static function say() 
    	{
            return self::$name;
        }
    }
    
    class Man extends Person 
    {
    	public static $name = 'Man';
    }
    
    echo Man::say();		//  Person
    

    在这个例子中,say()方法使用了 self 关键字,指的是 Person 类而不是 Man 类,所以 Person::say() 方法中无法访问静态变量最终值,但是有了静态延迟绑定,这个问题就可以得到解决了。

    静态延迟绑定

    class Person2 
    {
    	public static $name = 'Person';
    	
    	public static function say() 
    	{
    		return static::$name;	// 后期静态绑定从这里开始
    	}
    }
    
    class Man2 extends Person2 
    {
    	public static $name = 'Man';
    }
    
    echo Man2::say();		//  Man
    

    添加了静态延迟绑定后,当 Man2 调用静态方法 say() 时,static:: 会被解析为 Man2,而不是 say() 方法的定义类 Person。

    静态延迟绑定转发

    如果静态方法调用 parent:: 或者 self::,将转发调用信息。

    // 官网示例:
    class A 
    {
        public static function foo() 
        {
            static::who();
        }
    
        public static function who() 
        {
            echo __CLASS__."
    ";
        }
    }
    
    class B extends A 
    {
        public static function test() 
        {
            A::foo();
            parent::foo();
            self::foo();
        }
    
        public static function who() 
        {
            echo __CLASS__."
    ";
        }
    }
    class C extends B 
    {
        public static function who() 
        {
            echo __CLASS__."
    ";
        }
    }
    
    C::test();		//  A C C
    

    当调用 A::foo()时,static::解析到的是 A,
    当调用 parent:: 和 self:: 时,因为转发机制,static::被解析为当前实际调用类,也就是 C ,所以 parent::foo() = ‘C’,self::foo() = ‘C’

  • 相关阅读:
    Mybatis在oracle批量更新
    WebService小记
    java基本排序
    ant使用
    python 集合
    amazon-aws 使用 SNS 发送短信
    Html5+ 开发APP 后台运行代码
    CentOS7 -防火墙
    java 模拟表单方式提交上传文件
    修改pom项目版本 jenkins 关联 shell命令
  • 原文地址:https://www.cnblogs.com/duanbiaowu/p/5089328.html
Copyright © 2020-2023  润新知