php中靜態(tài)類與靜態(tài)變量用法的區(qū)別分析

字號(hào):


    static是定義一個(gè)靜態(tài)對(duì)象或靜態(tài)變量,關(guān)于static 定義的變量或類方法有什么特性我們看完本文章的相關(guān)實(shí)例后就見分曉了.
    1. 創(chuàng)建對(duì)象$object = new Class(),然后使用”->”調(diào)用:$object->attribute/function,前提是該變量/方法可訪問.
    2. 直接調(diào)用類方法/變量:class::attribute/function,無論是靜態(tài)/非靜態(tài)都可以,但是有前提條件.
    A. 如果是變量,需要該變量可訪問.
    B. 如果是方法,除了該方法可訪問外,還需要滿足.
    ① 如果是靜態(tài)方法,沒有特殊條件.
    ② 如果是非靜態(tài)方法,需要改方法中沒有使用$this,即沒有調(diào)用非靜態(tài)的變量/方法,當(dāng)然,調(diào)用靜態(tài)的變量/方法沒有問題.
    然后我們?cè)倏匆幌率褂?object->… 和使用class::… 都有什么區(qū)別:
    1. 使用$object->… ,需要執(zhí)行構(gòu)造函數(shù)創(chuàng)建對(duì)象.
    2. 使用class::… 調(diào)用靜態(tài)方法/變量,不需要執(zhí)行構(gòu)造函數(shù)創(chuàng)建對(duì)象.
    3. 使用class::… 調(diào)用非靜態(tài)方法/變量,也不需要執(zhí)行構(gòu)造函數(shù)創(chuàng)建對(duì)象.
    然后奇怪的地方就出來了,既然2和3都一樣,那靜態(tài)方法/變量存在還有什么意義呢?
    靜態(tài)static:聲明類成員或方法為 static,就可以不實(shí)例化類而直接訪問,不能通過一個(gè)對(duì)象來訪問其中的靜態(tài)成員(靜態(tài)方法除外),靜態(tài)成員屬于類,不屬于任何對(duì)象實(shí)例,但類的對(duì)象實(shí)例都能共享.
    例子,代碼如下:
    代碼如下:
    <?php
    Class Person{
    // 定義靜態(tài)成員屬性
    public static $country = "中國(guó)";
    // 定義靜態(tài)成員方法
    public static function myCountry() {
    // 內(nèi)部訪問靜態(tài)成員屬性
    echo "我是".self::$country."人<br />";
    }
    }
    class Student extends Person {
    function study() {
    echo "我是". parent::$country."人<br />";
    }
    }
    // 輸出成員屬性值
    echo Person::$country."<br />"; // 輸出:中國(guó)
    $p1 = new Person();
    //echo $p1->country; // 錯(cuò)誤寫法
    // 訪問靜態(tài)成員方法
    Person::myCountry(); // 輸出:我是中國(guó)人
    // 靜態(tài)方法也可通過對(duì)象訪問:
    $p1->myCountry();
    // 子類中輸出成員屬性值
    echo Student::$country."<br />"; // 輸出:中國(guó)
    $t1 = new Student();
    $t1->study(); // 輸出:我是中國(guó)人
    ?>
    運(yùn)行該例子,輸出:
    中國(guó)
    我是中國(guó)人
    我是中國(guó)人
    中國(guó)
    我是中國(guó)人
    小結(jié):在類內(nèi)部訪問靜態(tài)成員屬性或者方法,使用 self::(注意不是 $slef),代碼如下:
    代碼如下:
    slef:: $country
    slef:: myCountry()
    在子類訪問父類靜態(tài)成員屬性或方法,使用 parent::(注意不是 $parent),代碼如下:
    代碼如下:
    parent:: $country
    parent:: myCountry()
    外部訪問靜態(tài)成員屬性和方法為 類名/子類名::,代碼如下:
    代碼如下:
    Person::$country
    Person::myCountry()
    Student::$country
    但靜態(tài)方法也可以通過普通對(duì)象的方式訪問.
    例子,聲明靜態(tài)變量,代碼如下:
    代碼如下:
    <?PHP
    function foo(){
    static $int = 0;// correct
    static $int = 1+2; // wrong (as it is an expression)
    static $int = sqrt(121); // wrong (as it is an expression too)
    $int++;
    echo $int;
    }
    ?>
    例子,使用靜態(tài)變量的例子,代碼如下:
    代碼如下:
    <?PHP
    function Test()
    {
    static $w3sky = 0;
    echo $w3sky;
    $w3sky++;
    }
    ?>
    現(xiàn)在,每次調(diào)用 Test() 函數(shù)都會(huì)輸出 $w3sky 的值并加一.
    靜態(tài)變量也提供了一種處理遞歸函數(shù)的方法,遞歸函數(shù)是一種調(diào)用自己的函數(shù),寫遞歸函數(shù)時(shí)要小心,因?yàn)榭赡軙?huì)無窮遞歸下去,必須確保有充分的方法來中止遞歸,一下這個(gè)簡(jiǎn)單的函數(shù)遞歸計(jì)數(shù)到 10,使用靜態(tài)變量 $count 來判斷何時(shí)停止.
    例子,靜態(tài)變量與遞歸函數(shù),代碼如下:
    代碼如下:
    <?PHP
    function Test()
    {
    static $count = 0;
    $count++;
    echo $count;
    if ($count < 10) {
    Test();
    }
    $count--;
    }
    ?>