PHP官方也说过,大概是说self调用的就是本身代码片段这个类,而static调用的是从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类。

class A 
{
protected static $str = "This is class A";
public static function getStr()
{
echo self::$str;
}

}


class B extends A
{
protected static $str = "This is class B";
}


B::getStr();// 输出This is class A

class A
{
protected static $str = "This is class A";
public static function getStr()
{
echo static::$str;
}

}
class B extends A
{
protected static $str = "This is class B";
}


B::getStr();// 输出This is class B

self - 就是这个类,是代码段里面的这个类。

static - PHP 5.3新特性。当前这个类,有点像$this的意思,从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类。

class A
{
public function getSelf()
{
return new self();
}

public function getStatic()
{
return new static();
}

}


$f = new A();
print get_class($f->getSelf());
print get_class($f->getStatic());


class B extends A{
public function getSelf2()
{
return new self();
}

public function getStatic2()
{
return new static();
}
}


$f = new B();
print get_class($f->getSelf());
print get_class($f->getStatic());
print get_class($f->getSelf2());
print get_class($f->getStatic2());// 输出AAABBB