self 和 static 在范围解析操作符 ::
的使用上,并无区别。
静态函数中,self 和 static 可以调用静态属性和静态函数(没有实例化类,因此不能调用非静态的属性和函数)。
非静态函数中,self 和 static 可以调用静态函数和静态方法以及非静态函数。
此时,self 和 static 的表现是一样的,可以替换为该类名 ::
的方式调用。
继承时,self 和 static 在范围解析操作符 ::
的使用上有差别。parent 也是在继承的时候使用。
self 调用的静态方法或属性始终表示定义当前方法或属性所在的类的方法或属性,可以替换为其类名,但是在类名很长或者有可能变化的情况下,使用 self::
的方式无疑是更好的选择。
static 调用的静态方法或属性表示实际调用所在的类的方法或属性。
parent 用于调用父类的方法或属性。
class A
{
public static function who()
{
echo __CLASS__;
}
public static function foo()
{
static::who();
}
}
class B extends A
{
public static function test()
{
A::foo();
parent::foo();
self::foo();
}
public static function who()
{
echo __CLASS__;
}
}
class C extends B
{
public static function who()
{
echo __CLASS__;
}
}
C::test();
//output:ACC