php5.3已经开始支持延迟静态绑定。
延迟静态绑定指的是在父类中获取子类的最终状态。在父类中,如果出现self关键字,被子类继承后,这个self值的还是父类而不是子类。
如果在父类中出现了self关键字,并且子类继承了含有self的这段代码,那么需要考虑静态延迟绑定。在父类中使用static代替self.
说到底,self到底表示什么?self用在类中,引用自身的静态成员变量,表示的就是类名,完全可以被类名替换掉。被子类继承之后,self还是表示的父类名,而不是子类self了
Demo
未使用延迟静态绑定
class Par
{
public static function test()
{
echo 'par~~~<br>';
}
public static function who()
{
self::test();//self当前类的test方法
}
}
class Son extends Par
{
public static function test()
{
echo 'son~~~<br>';
}
}
Par::who();//par~~~ 父类的who
Son::who();//par~~~ 父类的who
使用延迟静态绑定
<?php
/**
* 延迟静态绑定
* Class Par
*/
class Par
{
public static function test()
{
echo 'par~~~<br>';
}
public static function who()
{
static::test();//使用延迟静态绑定
}
}
class Son extends Par
{
public static function test()
{
echo 'son~~~<br>';
}
}
Par::who();//par~~~ 父类的who
Son::who();//son~~~ 子类的who
总结
static延迟为使用延迟静态绑定static关键词指的是谁调用代表谁
self代表是指调用方法所属的对象