在类中调用静态方法

时间:2013-01-21 13:38:32

标签: php static

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()

3 个答案:

答案 0 :(得分:5)

你应该从类方法中调用self::runTest(),在类方法之外调用Test::runTest()

答案 1 :(得分:4)

  

self :: runTest()在类中调用方法时   在课外的时候测试:: runTest()?

准确!

答案 2 :(得分: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() 总是调用tellclass中定义的A方法。但是self::tellclass()允许子类使用他们自己的tellclass() 版本,如果他们有一个。正如@One Trick Pony所说,你还应该检查一下后期的静态绑定:http://ca2.php.net/manual/en/language.oop5.late-static-bindings.php