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()
时
答案 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