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’

上一篇:转:45 个 LoadRunner 面试问题(附答案)_纯英文,太有逼格了


下一篇:iOS中静态库-.a文件生成和使用