這篇文章主要介紹了php中靜態類別與靜態變數用法的區別,以實例形式較為詳細的分析了php中靜態類別與靜態變數的定義、功能及使用技巧,需要的朋友可以參考下
本文實例分析了php中靜態類別與靜態變數用法的差異。分享給大家供大家參考。具體分析如下:
static是定義一個靜態物件或靜態變數,關於static 定義的變數或類別方法有什麼特性我們看完本文章的相關實例後就見分曉了.
1. 建立物件$object = new Class(),然後使用」->」呼叫:$object->attribute/function,前提是該變數/方法可存取.
2. 直接呼叫類別方法/變數:class::attribute/function,無論是靜態/非靜態都可以,但是有前提條件.
A. 如果是變數,需要該變數可存取.
B. 如果是方法,除了該方法可存取外,還需要滿足.
① 如果是靜態方法,沒有特殊條件.
② 如果是非靜態方法,需要改方法中沒有使用$this,即沒有呼叫非靜態的變數/方法,當然,呼叫靜態的變數/方法沒有問題.
然後我們再看一下使用$object->… 和使用class::…都有什麼差別:
#1. 使用$object->… ,需要執行建構子建立物件.
2. 使用class: :… 呼叫靜態方法/變量,不需要執行建構子建立物件.
3. 使用class::… 呼叫非靜態方法/變量,也不需要執行建構子建立物件.
#然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變數存在還有什麼意義呢?
靜態static:宣告類別成員或方法為static,就可以不實例化類別而直接存取,不能透過一個物件來存取其中的靜態成員(靜態方法除外),靜態成員屬於類別,不屬於任何物件實例,但類別的物件實例都能共用.
範例,程式碼如下:
# 程式碼如下:
<?php Class Person{ // 定义静态成员属性 public static $country = "中国"; // 定义静态成员方法 public static function myCountry() { // 内部访问静态成员属性 echo "我是".self::$country."人<br />"; } } class Student extends Person { function study() { echo "我是". parent::$country."人<br />"; } } // 输出成员属性值 echo Person::$country."<br />"; // 输出:中国 $p1 = new Person(); //echo $p1->country; // 错误写法 // 访问静态成员方法 Person::myCountry(); // 输出:我是中国人 // 静态方法也可通过对象访问: $p1->myCountry(); // 子类中输出成员属性值 echo Student::$country."<br />"; // 输出:中国 $t1 = new Student(); $t1->study(); // 输出:我是中国人 ?>
執行此例子,輸出:
中國
我是中國人
我是中國人
中國
我是中國人
小結:在類別內部存取靜態成員屬性或方法,使用self:: (注意不是$slef),程式碼如下:
程式碼如下:
slef:: $country slef:: myCountry()
在子類別中存取父類別靜態成員屬性或方法,使用parent::(注意不是$parent ),程式碼如下:
程式碼如下:
parent:: $country parent:: myCountry()
外部存取靜態成員屬性與方法為類別名稱/子類別名稱::,程式碼如下:
程式碼如下:
Person::$country Person::myCountry() Student::$country
但靜態方法也可以透過普通物件的方式存取.
範例,宣告靜態變數,程式碼如下:
程式碼如下:
<?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; } ?>
範例,使用靜態變數的範例,程式碼如下:
# 程式碼如下:
<?PHP function Test() { static $w3sky = 0; echo $w3sky; $w3sky++; } ?>
現在,每次呼叫Test()函數都會輸出$w3sky 的值並加一.
靜態變數也提供了一種處理遞歸函數的方法,遞迴函數是一種呼叫自己的函數,寫遞歸函數時要小心,因為可能無窮遞歸下去,必須確保有充分的方法來中止遞歸,一下這個簡單的函數遞歸計數到10,使用靜態變數$count 來判斷何時停止.
範例,靜態變數與遞歸函數,程式碼如下:
程式碼如下:
<?PHP function Test() { static $count = 0; $count++; echo $count; if ($count < 10) { Test(); } $count--; } ?>
註記:靜態變數可以依照上面的範例宣告,如果在宣告中用表達式的結果對其賦值會導致解析錯誤.
在php中,存取類別的方法/變數有兩種方法:
1. 建立物件$object = new Class(),然後使用」->」呼叫:$object-> attribute/function,前提是該變數/方法可存取。
2. 直接呼叫類別方法/變數:class::attribute/function,無論是靜態/非靜態都可以。但是有前提條件:
A. 如果是變量,需要該變數可存取。
B. 如果是方法,除了方法可存取外,還需要滿足:
b1) 如果是靜態方法,沒有特殊條件;
b2) 如果是非靜態方法,則需要改方法中沒有使用$this,也就是沒有呼叫非靜態的變數/方法,當然,呼叫靜態的變數/方法沒有問題。
然後我們再看一下使用$object->… 和使用class::…都有什麼差別:
1. 使用$object->… ,需要執行建構子建立物件;
2. 使用class::… 呼叫靜態方法/變量,不需要執行建構子建立物件;
3. 使用class::… 呼叫非靜態方法/變量,也不需要執行建構子建立物件。
然後奇怪的地方就出來了,既然2和3都一樣,那麼靜態方法/變數存在還有什麼意義呢?
差異還是顯然存在的,如下:
1. 靜態變數
靜態成員只保留一個變數值,而這個變數值對所有的實例都是有效,也就是說,所有的實例共享這個成員。
2. 靜態方法
靜態方法可以直接使用class::… 來調用,而非靜態方法需要滿足一定限制條件才能使用class::.. 的方法調用,如之前所述
以上是php中靜態類別與靜態變數的用法及區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!