PHP static靜態屬性和靜態方法
Static(靜態)關鍵字
聲明類屬性或方法爲靜態,就可以不實例化類而直接訪問。靜態屬性不能通過一個類已實例化的對象來訪問(但靜態方法可以)。
爲了兼容 PHP 4,如果沒有指定訪問控制,屬性和方法默認爲公有。
由於靜態方法不需要通過對象即可調用,所以僞變量 $this 在靜態方法中不可用。
靜態屬性不可以由對象通過 -> 操作符來訪問。
用靜態方式調用一個非靜態方法會導致一個 E_STRICT 級別的錯誤。
就像其它所有的 PHP 靜態變量一樣,靜態屬性只能被初始化爲文字或常量,不能使用表達式。所以可以把靜態屬性初始化爲整數或數組,但不能初始化爲另一個變量或函數返回值,也不能指向一個對象。
自 PHP 5.3.0 起,可以用一個變量來動態調用類。但該變量的值不能爲關鍵字 self,parent 或 static
詳細介紹
<?php
class QiPaService
{
static public $name = '奇葩天地網';
public $url = 'www.qipa250.com';
//靜態方法
public static function XiaoQipa()
{
echo self::$name;
//echo $this->url;
//這裏報錯,靜態方法不能調用非靜態屬性,因爲 $this代表實例化對象,而這裏是類,不知道 $this 代表哪個對象
}
public function DaQiPa()
{
echo $this->url;
//普通方法調用靜態屬性,同樣使用self關鍵詞
echo self::$name;
}
}
$qipa = new QiPaService();
//對象可以訪問靜態方法
$qipa->XiaoQipa();
$qipa->DaQiPa();
//對象訪問靜態屬性。不能這麼訪問$qipa->name,因爲靜態屬性的內存位置不在對象裏
$qipa::$name;
$qipa->url;//對象可以訪問普通屬性
$qipa::XiaoQipa();
//DaQiPa()方法有$this時出錯;沒有$this時能出結果,會有警告
$qipa::DaQiPa();
//靜態方法不需要實例化即可調用
QiPaService::XiaoQipa();
?>
結論:
(1)靜態屬性不需要實例化即可調用。因爲靜態屬性存放的位置是在類裏,調用方法爲"類名::屬性名";
(2)靜態方法不需要實例化即可調用。同上
(3)靜態方法不能調用非靜態屬性。因爲非靜態屬性需要實例化後,存放在對象裏;
(4)靜態方法可以調用非靜態方法,使用 self 關鍵詞。php裏,一個方法被self:: 後,它就自動轉變爲靜態方法;