在类中使类不变

Kir*_*lla 7 php

self::CONSTANT_NAME和之间有什么区别static::CONSTANT_NAME

static::仅通过5.3功能调用常量?

Jur*_*man 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();
?>
Run Code Online (Sandbox Code Playgroud)

这输出A,这并不总是令人满意的.现在替换selfstatic创建:

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*Jon 5

差异几乎就是后期静态绑定的全部内容.

简短说明:

self::将引用使用self ::编写代码的类类型.

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

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