最近在做一个小项目练手的时候,再次遇到静态方法和普通方法的区别问题。以前模模糊糊的得过且过,这次没有在放过,通过小例子深入理解了下。
class Person
{
public function left()
{
echo 'Person turn left';
}
public function run()
{
$this->left();
}
}
class Student extends Person
{
public function left()
{
echo 'Student turn left';
}
}
$student = new Student();
$student->run();
------------
Student turn left
------------
Student类继承了Peson类的 left() 和 run() 方法,可以看出 run() 中的$this此时指代当前被实例化的类Student,所以它没有指向Person类的 left() 方法。
让我们继续。
将两个类中的方法都设为静态方法。
class Person
{
public static function left()
{
echo 'Person turn left';
}
public static function run()
{
self::left();
}
}
class Student extends Person
{
public static function left()
{
echo 'Student turn left';
}
}
------------
Person turn left
------------
可以看出 Person::run() 中的 self 此时指代父类Person。
联系到以前看到的技术大牛的文章,我理解到 静态方法属于“类”的“财产”,它的作用范围是被划定在所属类中的,即使该类的子类存在同名静态方法,它也不会调用。self 的意思是指静态方法所属的类。
普通方法不属于“类”的“财产”,它的作用范围会被划定在继承了这个普通方法并且已经实例化的子类中,如果该子类中存在同名的普通方法,就会调用子类中的这个方法。$this的意思是当前对象,即继承了该普通方法并且已经实例化的当前类。$ 很生动,因为在php中 $ 用于声明调用变量,类是固定的,但是一个类可以实例化出很多对象,对象是不固定的所以用 $ 很生动。