最近在做ECMall的二次开发时,留意到ECMall的启动方法的调用方式为
ECMall::startup
而startup并不是类ECMall的静态方法,为什么可以这样使用呢?在这种调用方式下,类的成员$this又会指代什么呢?我们来做个测试:
<?php
class FirstClass {
public function output() {
if (isset($this)) {
echo '$this is defined (' . get_class($this) . ").\n";
} else {
echo "\$this is not defined.\n";
}
}
}
class SecondClass {
public function output() {
FirstClass::output();
}
}
$firstClass = new FirstClass();
$firstClass->output();
$firstClass::output();
FirstClass::output();
$secondClass = new SecondClass();
$secondClass->output();
$secondClass::output();
SecondClass::output();
?>
输出结果如下: $this is defined (FirstClass).
$this is not defined.
$this is not defined.
$this is defined (SecondClass).
$this is not defined.
$this is not defined.
这里要留意到一个细节:在通过SecondClass类调用其成员方法output时,$this是undefined的,当使用SecondClass类的对象调用output方法时,FirstClass中的$this指向了SecondClass的对象。
虽然php的成员方法和Java或C++中的静态方法非常像,但当我们为FirstClass的output方法增加static修饰时,输出又有所不同:
$this is not defined.
$this is not defined.
$this is not defined.
$this is not defined.
$this is not defined.
$this is not defined.
不难看出,如果将FirstClass的output定义为static时,无论通过何种方式,在output中的$this都是undefined。