这是正常的吗?

时间:2012-10-22 00:13:05

标签: php class static late-static-binding

我不知道这种后期静态绑定是如何工作的。

abstract class A{

  final public static function doprint(){
    print get_called_class() . '<br>';
  }


  public static function wrapper(){
    self::doprint();
    static::doprint();
  }

}

class A2 extends A{}    

A2::wrapper();

get_called_class()在两种情况下都打印A2,即使我用self调用doprint方法也是如此。为什么呢?

2 个答案:

答案 0 :(得分:1)

我认为get_called_class()告诉你调用了哪个类,并且它的输出是正确的。

后期静态绑定允许self上下文冒泡,因此定义得更高的方法可以对被调用方法的对象进行操作。

答案 1 :(得分:1)

get_called_class()始终返回您实际调用的类。你打电话给 A2 :: 所以它是A2。

在我的网站上有一个带有 LSB单例抽象类的教程。我没有链接到这里,因为总是有一个僵尸警戒来到并删除链接甚至没有看。 但它在我的描述中。

LSB的捕获是A中的方法可以调用B中的方法,该方法可以调用A中的方法。 请参阅此示例:

header('Content-Type: text/plain'); // Pretty text output
// LSB Parent
class A {
    // NOLSB: Will call Current Class method
    static public function TriggerSelf() {
        self::OverrideMe();
    }
    // LSB: Will call Inheriting Class method (or Current if none Inherits)
    static public function TriggerStatic() {
        static::OverrideMe();
    }
    // Method to Override
    static public function OverrideMe() {
        echo 'A here', PHP_EOL;
    }
}

// LSB Child
class B extends A {
    // Override by LSB
    static public function OverrideMe() {
        echo 'B here', PHP_EOL;
    }
}

A::TriggerSelf(); // <- NO LSB
A::TriggerStatic(); // <- LSB (but not inheritance)

B::TriggerSelf(); // <- NO LSB
B::TriggerStatic(); // <- LSB (with inheritance, so it works)

了解 B :: TriggerStatic()如何允许A调用B方法,而 B :: TriggerSelf()调用A方法。 那是LSB。父类静态方法可以调用子类静态方法。这是非常静态的摘要:)

研究这个例子,它会有意义。