在类中使类不变

时间:2010-12-24 10:54:20

标签: php

self::CONSTANT_NAMEstatic::CONSTANT_NAME之间有什么区别?

仅通过static::调用5.3功能吗?

2 个答案:

答案 0 :(得分:6)

当你使用static :: NAME时,它是一个称为后期静态绑定(或LSB)的功能。有关此功能的更多信息,请访问LSB的php.net文档页面:http://nl2.php.net/manual/en/language.oop5.late-static-bindings.php

这个用例就是一个例子:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

这输出A,这并不总是令人满意的。现在用self替换static会产生以下结果:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

并且,正如您所料,它输出“B”

答案 1 :(得分:5)

差异几乎就是late static bindings的全部内容。

简短说明:

self::将引用类型,其中使用self ::编写的代码

static::将引用实际对象的类类型,其中使用static ::的代码正在执行

这意味着如果我们讨论同一继承层次结构中的类,那就只有区别了。