class Test {
    public function __construct() {
        self::runTest();
        Test::runTest();
    }

    public static function runTest() {
        echo "Test running";
    }
}

// echoes 2x "Test running"
new Test();


self::runTest()Test::runTest()有什么区别?如果是这样,我应该使用哪一个?

在类内调用方法时使用self::runTest(),在类外调用方法时使用Test::runTest()

最佳答案

这里有一些示例代码来说明正在发生的事情:

class A {
  function __construct(){
     echo get_class($this),"\n";
     echo self::tellclass();
     echo A::tellclass();
  }

  static function tellclass(){
    echo __METHOD__,' ', __CLASS__,"\n";
  }

}

class B extends A {
}

class C extends A{
    function __construct(){
        echo "parent constructor:\n";
        parent::__construct();
        echo "self constructor:\n";
        echo get_class($this),"\n";
        echo self::tellclass();
        echo C::tellclass();
    }

    static function tellclass(){
        echo __METHOD__, ' ', __CLASS__,"\n";
    }
}

$a= new A;
// A
//A::tellclass A
//A::tellclass A

$b= new B;
//B
//A::tellclass A
//A::tellclass A

$c= new C;

//parent constructor:
//C
//A::tellclass A
//A::tellclass A

//self constructor:
//C
//C::tellclass C
//C::tellclass C


要点是,A::tellclass()始终调用tellclass中定义的A方法。但是self::tellclass()允许子类使用自己的tellclass()版本(如果有的话)。正如@One Trick Pony指出的那样,您还应该签出后期静态绑定:http://ca2.php.net/manual/en/language.oop5.late-static-bindings.php

10-06 03:15