使用static關鍵字可以將類中的成員標識為靜態,既可 以用來標識成員屬性,也可以用來標識成員方法。普通成員作為對象屬性存在,以Person類為例,如果在Person中有一個"$conuntry = 'china'"的成員屬性,任何一個Person類的對象都會擁有自己的一份$country屬性,對象之間不會干擾。而static成員是作為整個類的屬性存在,如果將$country屬性使用static關鍵字標識,則不管通過Person類建立多少個對象(甚至可以是沒有對象),這個static成員總是唯一存在的,在多個對象之間共用的。因為使用static標識
的成員屬性是屬於類的,所以與對象執行個體和其他的類無關。類的靜態屬性非常類似於函數的全域變數。類中的靜態成員是不需要對象而使用類名來直接存取的,格式如下所示:
類名::靜態成員屬性名;
類名::靜態成員方法名()
在類中聲明的成員方法中,也可以使用關鍵字"self"來訪問其他靜態成員。因為靜態成員是屬於類的,而不屬於任何對象,所以你不能用$this來引用它,而在PHP中給我們提供 的self關鍵字,就是在類的成員用來代表本類的關鍵字。格式如下 所示;
self::靜態成員屬性名; //在類的成員方法中使用這種方式訪問本類中的靜態成員屬性
self::靜態成員方法名(); //在類的成員方法中使用這種方式訪問本類中的靜態成員方法
如果在類的外部存取類中的靜態成員,可以使用對象引用和使用類名訪問,但通常選擇用類名來訪問。如果在類內部的成員方法中訪問其他的靜態成員,通常使用self的形式去訪問,最好不要直接使用類名稱。在下面的例子中聲明一個Myclass類,為了讓類中的count屬性可以在每個對象中共用,將其聲明為static成員,用來統計通過Myclass類一共建立了多少對象。代碼如下所示:
<?php
class Myclass{
static $count;
function __contruct(){
self::$count++;
}
static function getcount(){
}
static function gecount()
return self::$count;
}
}
Myclass::$count=0;
$myc1 = new Myclass();
$myc2 = new Myclass();
$myc3 = new Myclass();
echo Myclass::getCount();
echo $myc3->getCount();
上例的Myclass類中,在構造方法內部和成員方法getCount()的內部,都使用self訪問本類中使用static標識為靜態屬性count,並在類的外部使用類名訪問類中的靜態屬性。可以看到同一個類中的靜態成員在每個對象中共用,每建立一個對象靜態屬性count就自增1.用來統計執行個體化對象的次數。
另外在使用靜態方法時需要注意,在靜態方法中只能訪問靜態成員。因為非靜態成員必須通過對象的引用才能訪問,通常是使用$this完成的。而靜態方法在對象不存在的情況下也可以直接使用類名來訪問,沒有對象就沒$this引用,沒有了$this引用就不能訪問類中的非靜態成員,但是可以使用類名或self在非靜態方法中訪問靜態成員。