php中static靜態類與static 靜態變量用法區別


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都一樣,那靜態方法/變量存在還有什么意義呢? 
靜態 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

但靜態方法也可以通過普通對象的方式訪問

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM