PHP使用static關鍵字聲明靜態屬性和靜態方法
在PHP中,通過static關鍵字修飾的成員屬性和成員方法被稱為靜態屬性和靜態方法。
靜態屬性和靜態方法不需要在被類實例化的情況下就可以直接使用。
1. 靜態屬性
靜態屬性就是使用static關鍵字修飾的成員屬性,它屬於類本身而不屬於類的任何實例。它相當於存儲在類中的全局變量,可以在任何位置通過類來訪問。
靜態屬性不能通過一個類已實例化的對象來訪問。
靜態屬性訪問的語法格式如下:
類名稱::$靜態屬性名稱
其中的符號“::”被稱為范圍解析操作符,用於訪問靜態屬性、靜態方法和常量,還可以用於覆蓋類中的成員和方法。
在靜態屬性的名稱前加上操作符“self::”,即可在類內部的成員方法中訪問靜態屬性。而只使用類名稱::,則可以在類外面調用類內部的靜態屬性。
注意:
靜態屬性不可以由對象通過->操作符來訪問。
就像其它所有的PHP靜態變量一樣,靜態屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態屬性初始化為整數或數組,但不能初始化為另一個變量或函數返回值,也不能指向一個對象。
2. 靜態方法
靜態方法就是通過static關鍵字修飾的成員方法。由於它不受任何對象的限制,所以可以不通過類的實例化直接引用類中的靜態方法。
靜態方法可以通過一個類已實例化的對象來訪問。
靜態方法引用的語法格式如下:
類名稱::靜態方法名稱([參數1,參數2,...])
同樣,在靜態方法的名稱前加上操作符“self::”,即可在類內部的成員方法中引用靜態方法。而只使用類名稱::,則可以在類外面調用類內部的靜態方法。
注意:
在靜態方法中,只能調用靜態變量,而不能調用普通變量;而普通方法則可以調用靜態變量。
用靜態方式調用一個非靜態方法會導致一個E_STRICT級別的錯誤。
由於靜態方法不需要通過對象即可調用,所以偽變量$this在靜態方法中不可用。
提示
使用靜態成員,除了可以不需要實例化對象,另一個作用就是在對象被銷毀后,仍然保存被修改的靜態數據,以便下次繼續使用。
為了兼容PHP 4,如果沒有指定為protected或private,靜態屬性和靜態方法則默認為公有public。
自PHP 5.3.0起,可以用一個變量來動態調用類,但該變量的值不能為關鍵字self、parent或static。
說明
靜態成員不用實例化對象,當類第一次被加載時就已經分配了內存空間,所以直接調用靜態成員的速度要快一些。但如果靜態成員聲明得過多,空間一直被占用,反而會影響系統的功能。這個尺度只能通過實踐積累才能真正把握!
實例
<?php
class website{
static $num="0"
; // 定義靜態變量
public function visit(){ // 定義visit方法
echo "您是第".self::$num."位訪客!"; // 輸出靜態變量信息
self::$num++; // 靜態變量做自增運算
}
}
echo '第一次實例化調用:<br />';
$website=new website(); // 實例化對象
$website->visit(); // 調用對象$website的visit()方法
$website->visit();
$website->visit();
echo '<br />第二次實例化調用:<br />';
$website2=new website(); // 改變對象句柄實例化對象
$website2->visit();
$website2->visit();
$website2->visit();
?>
在瀏覽器中查看PHP使用static關鍵字聲明靜態屬性和靜態方法的顯示效果。如下圖所示: