PHP类中self和static关键字的区别

PHP类中self和static关键字的区别

问:怎样才能提现出区别?
答:在同一个类中,这两个关键字提现不出区别,只有把这两个关键字写在父类,再由子类去调用时,才能提现出区别。


问:区别在哪?
答:在父类定义两个方法,分别用selfstatic去获取类名并返回,然后用子类对象去调用父类的这两个方法,输出会有区别。

  • 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指的是被调用的类。

参考:PHP static关键字和self关键字的区别

打赏

Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

PHP类中self和static关键字的区别