1. 程式人生 > >PHP static關鍵字和self關鍵字的區別

PHP static關鍵字和self關鍵字的區別

訪問方式 進行 source strac 說明 屬性 php extend xtend

在PHP的一個類中,帶有static關鍵字的方法和屬性被稱為靜態方法和靜態屬性,這樣的方法和屬性可以通過類直接訪問,而不需要通過類對應的實例來進行訪問,在類中訪問靜態變量以及靜態屬性的時候,可以使用self關鍵字和static關鍵字,兩種訪問方式看起來似乎沒有區別,但是實際上還是不一樣的

abstract class Person
{
    public static $_className = ‘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::$_className; } public function staticGetClassName() { return static::$_className
; } } class Driver extends Person { public static $_className = ‘Driver‘; public static function getIntro() { return ‘this is a Driver‘; } } $temp = new Driver; echo $temp->getClassName().‘<br>‘; echo $temp->say().‘<br>‘; //static echo $temp->staticGetClassName().‘<br>‘;
echo $temp->staticSay().‘<br>‘;

運行之後的結果為:

Person
this is a Person
Driver
this is a Driver

由此可看出,在類中使用self關鍵字訪問的靜態方法以及靜態變量時,self被解析為定義方法和變量的類,在使用static關鍵字訪問的時候,static指的是被調用的類

在抽象類中加入方法print打印一個類的實例:

abstract class Person
{
    public static $_className = ‘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::$_className;
    }

    public function staticGetClassName()
    {
        return static::$_className;
    }
//print方法用於打印一個類的實例
    public function print()
    {
        print_r(new self());
    }
}

$temp = new Driver;
$temp->print();

運行後會報“Cannot instantiate abstract class Person”錯誤,原因是此時$temp->print()方法中new self()指的是定義的Person這個類,而抽象類是無法實例化的,此時將方法改為:

public function print()
{
    print_r(new static());
}

即可成功運行,輸出Driver Object ( ),說明此時打印出來的實例為Driver類的實例

PHP static關鍵字和self關鍵字的區別