2011年10月14日星期五

PHP后期静态绑定(Late Static Binding)

最近又一次开始大用特用PHP。同以往多年的PHP经验不同,这次大规模的采用了PHP的OOP方式设计程序。用下来发现PHP的OOP功能相当的强大,比起Java也是不徨多让。

PHP的“后期静态绑定”功能就是一个很有特色的功能,参考下面的例子:
 
<?php
class Class1 {
    public static function hello() {
        echo "Class1 say hello\n";
    }
    public static function goodbye() {
        echo "Class1 say goodbye\n";
    }
    public function greeting() {
        echo "I am a ".get_class($this)."\n";
        static::hello();
        self::goodbye();
    }
}
class Class2 extends Class1 {
    public static function hello() {
        echo "Class2 say hello\n";
    }
}
class Class3 extends Class2 {
    public static function goodbye() {
        echo "Class3 say goodbye\n";
    }
}
$c1 = new Class1();
$c2 = new Class2();
$c3 = new Class3();
$c1->greeting();
$c2->greeting();
$c3->greeting();
?>

以上程序的输出是:
 
I am a Class1
Class1 say hello
Class1 say goodbye
I am a Class2
Class2 say hello
Class1 say goodbye
I am a Class3
Class2 say hello
Class1 say goodbye

可以看出,当使用static::来引用静态方法的时候,PHP调用的是当前类的同名方法,如果没有找到,顺着继承顺序往上找。如果使用的是self::来引用,则直接调用定义该静态方法的类里面的那个。

没有评论: