首頁 >後端開發 >php教程 >PHP中什麼是靜態?深入了解靜態屬性和靜態方法

PHP中什麼是靜態?深入了解靜態屬性和靜態方法

青灯夜游
青灯夜游轉載
2021-07-09 19:25:053631瀏覽

這篇文章帶大家了解PHP中的靜態屬性和靜態方法,介紹一下靜態的本質、靜態變數和普通變數的差別,希望對大家有幫助。

PHP中什麼是靜態?深入了解靜態屬性和靜態方法

靜態是什麼?

我們之前講到, 呼叫成員變數和方法, 都需要用到物件. 但如果我們不想實例化, 直接存取變數和方法呢? 這就用到了靜態static功能.

在定義變數和方法的時候, 在前面加上static關鍵字, 就轉化為了靜態, 就可以透過類別名稱::雙引號直接進行存取.

我們繼續將上面的例子改寫為靜態變數和靜態方法:

class Classname          //定义一个类, 类名不区分大小写
{
static public $name;      //定义静态成员变量;
static public $height=180;    //初始化赋值
static public $weight, $nationality; //可以一个语句定义多个变量
static protected $age;

static public function player($name,$height, $weight, $age, $sex)
{                    //定义静态成员方法, 以及方法形参
    self::$name=$name;                 //为成员变量赋值, 使用了代词self::
    self::$weight=$weight;
    self::$height=$height;

    if (self::$height<185 && self::$weight<=85){
        return self::$name.&#39;,符合要求&#39;;
    }else{
        return self::$name.&#39;,不太行&#39;;
    }
}
}
echo Classname::$height;              //180, 通过类名::访问静态变量
echo Classname::player(&#39;xiaoming&#39;,180,80,22, &#39;Male&#39;);  //通过类名::访问静态方法;

上面的例子可以注意到, 我將所有的$this都換成了self. 因為$this指代的是調用對象, 而self指代的方法所在的類本身. 靜態方法可以通過類名::直接調用, 這裡沒有對象, \$this指代的就為空, 系統就會報錯. 所以靜態方法內調用變數, 不能透過$this.

注意self::後面的變數要有$符號.

靜態的本質

不要小瞧這個static, 加上了它, 其實不只是可以直接呼叫這麼簡單, 成員變數和方法的意義發生了本質上的變化:

在靜態方法中只能呼叫靜態變數, 而不能呼叫普通變數, 普通方法則可以呼叫靜態變數. 這是由靜態方法的屬性決定的, 因為普通的成員變數是與"物件"綁定的,而靜態變數是與"類別"綁定的.

我再詳細解釋靜態變數和普通變數的區別:

  • 普通的成員變數與物件綁定, 不同的物件都有一套屬於自己的成員變數. 不同物件的成員變數都有各自的賦值, 雖然有可能相同, 但你的就是你的.

  • 靜態變數是和類別綁定的. 如果靜態變數改變了, 那麼這個類別所有的物件中, 這個值都會改變.

  • 靜態變數也可以透過物件::來進行存取, 但其實同一個類別的物件存取的其實都是同一個靜態變數值. 可以理解為靜態變數是整個類別共享的, 包括它的子類別.

  • 所以即便其中一個物件被銷毀了, 靜態變數值還會保留.

  • #子類別也可以重寫父類別的靜態成員變數, 但父類別的靜態變數依然存在, 這兩個靜態成員變數是獨立的. 會根據呼叫的類別名稱分別進行存取.

我們舉個例子:

class Shouji
{
    static public $test;           //定义一个静态变量
    static function test5()        //定义静态方法来操作并输出静态变量
    {
        self::$test++;
        echo self::$test;
    }
}
class Shouji2 extends  Shouji          //定义一个子类
{
    static function test5()           //定义子类的静态方法
    {
        self::$test++;                 //访问并操作父类的静态变量
        echo self::$test;
    }
}
$shouji1=new Shouji;               //新建父类对象
$shouji1->test5();     //1, 通过对象调用静态方法
$shouji2=new Shouji;   //新建另一个父类对象
$shouji2->test5();    //2,  在前一次操作基础上继续+1
$shouji3=new Shouji2;    //新建子类对象
$shouji3->test5();    //3, 调用子类同名静态方法, 继续+1
echo Shouji::$test;    //3, 通过父类::直接访问静态成员变量
echo $shouji1::$test;   //3, 通过对象名::可以直接访问静态成员变量

透過上面這個範例, 我們還能有以下幾點總結:

  • 子類別可以重寫父類別的靜態方法.

  • 方法內存取靜態變數需要用::符號. 不能用$this;

  • 靜態方法和靜態變數都會被子類別繼承.

  • 靜態變數不能由->存取, 而是由::(雙冒號)進行存取

  • 物件可以透過物件名稱->直接呼叫靜態成員方法, 這個和呼叫普通方法是一樣的.

本文轉載自:https://juejin.cn/post/6977200691919978510

#作者:傳達室老闆

推薦學習:《PHP影片教學

以上是PHP中什麼是靜態?深入了解靜態屬性和靜態方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除