2
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()外でメソッドを呼び出すときは?

4

3 に答える 3

5

self::runTest()クラスメソッドの内側とクラスメソッドのTest::runTest()外側から呼び出す必要があります

于 2013-01-21T13:39:42.153 に答える
4

何が起こっているかを示すコードの例を次に示します。

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() 常に呼び出すことです。ただし、子クラスに独自のバージョンがある場合は、それを使用できます。@One Trick Pony が指摘しているように、遅延静的バインディングも確認する必要があります: http://ca2.php.net/manual/en/language.oop5.late-static-bindings.phptellclassAself::tellclass()tellclass()

于 2013-01-21T14:12:19.027 に答える
4

クラス内でメソッドを呼び出すときは self::runTest() 、クラス外のときは Test::runTest() ですか?

まさに!

于 2013-01-21T13:40:36.707 に答える