PHP类中self和static关键字的区别
问:怎样才能提现出区别?
答:在同一个类中,这两个关键字提现不出区别,只有把这两个关键字写在父类,再由子类去调用时,才能提现出区别。
问:区别在哪?
答:在父类定义两个方法,分别用self
和static
去获取类名并返回,然后用子类对象去调用父类的这两个方法,输出会有区别。
self
我在哪个类中,我就代表谁,由于self
是在父类,所以即使是子类调用的它,但它还是代表父类,用它去获取到的类名自然也是父类的类名,用它去调用的方法自然也是父类的方法(即使子类有同名方法也会调用父类的);static
哪个类(或对象)调用我,我就代表那个类(或那个对象所属的类),因为是子类(Driver)调用的它,所以它就代表子类,用它去获取到的类名自然也是子类名,用它去调用方法,调用的也是子类的方法(即使父类有同名函数),当然由于子类方法本来就会覆盖父类,所以这个特性倒是没什么;
以下是例子
class Person {
public static function getIntro(){
return 'This is a Person';
}
public function say(){
return self::getIntro();
}
public function staticSay(){
return static::getIntro();
}
public function getClassName(){
return self::class;
}
public function staticGetClassName(){
return static::class;
}
}
class Driver extends Person {
public static function getIntro() {
return 'This is a Driver';
}
}
$driver = new Driver;
//self
echo $driver->getClassName()."\n";
echo $driver->say()."\n";
//static
echo $driver->staticGetClassName()."\n";
echo $driver->staticSay()."\n";
运行之后的结果为:
Person
this is a Person
Driver
this is a Driver
由此可看出,在类中使用self关键字访问的静态方法以及静态变量时,self被解析为定义方法和变量的类,在使用static关键字访问的时候,static指的是被调用的类。
觉得文章对你有用的话鼓励一下我吧