class A{
public $age = 50;
private $money = 2000;
static public $head = 1;
public function tell(){
echo $this->age,'<br />';
echo self::$head,'<br />';
}
static public function sayMoney(){
echo $this->money,'<br />';
}
}
class B extends A{
public $age = 22;
private $money = 10;
public function subtell(){
parent::tell();
echo $this->age,'<br />';
}
public function subMoney()
{
parent::sayMoney();
echo $this->money,'<br />';
}
}
$b = new B();
$b->subtell();//22 1 22;
echo '<hr />';
$b->subMoney();
最后一句话报错Using $this when not in object context
但在调用subMoney()时不就绑定了$this,$this指向b对象,之后执行parent::sayMoney();由于静态调用,所以不绑定$this.在sayMoney()执行的时候不应该得到2000吗,为什么会报错,和前面$b->subtell();调用有啥不一样
首先需要明确,静态变量和静态方法都是属于类的,可以通过类名直接调用类的静态方法
类名::静态方法名(参数)
,而且静态方法只能访问静态变量,访问的时候通过self::静态变量名
,而且类的静态变量只能被初始化为文字或常量,不能使用表达式(比如public static $a = time();
是错误的),即不能初始化为另一个变量或函数返回值.总之,
$this
表示的是对象(类的实例).而类静态的东西需要通过
::
调用,比如:类名::静态方法名(参数)
self::静态方法名
self::静态变量
在子类调用父类的静态变量和方法则需要
parent::xxx