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__."\n";
    }
}

class B extends A 
{
    public static function test() 
    {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() 
    {
        echo __CLASS__."\n";
    }
}
class C extends B 
{
    public static function who() 
    {
        echo __CLASS__."\n";
    }
}

C::test();		//  A C C

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

posted @ 2015-12-30 16:45  洋芋土豆  阅读(280)  评论(0编辑  收藏  举报