php中static靜態類與static 靜態變數用法區別_PHP教程

來源:互聯網
上載者:User
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 ,就可以不執行個體化類而直接存取,不能通過一個對象來訪問其中的靜態成員(靜態方法除外)。靜態成員屬於類,不屬於任何對象執行個體,但類的對象執行個體都能共用。

例子:

代碼如下 複製代碼

Class Person{
// 定義靜態成員屬性
public static $country = "中國";
// 定義靜態成員方法
public static function myCountry() {
// 內部訪問靜態成員屬性
echo "我是".self::$country."人
";
}
}
class Student extends Person {
function study() {
echo "我是". parent::$country."人
";
}
}
// 輸出成員屬性值
echo Person::$country."
"; // 輸出:中國
$p1 = new Person();
//echo $p1->country; // 錯誤寫法
// 訪問靜態成員方法
Person::myCountry(); // 輸出:我是中國人
// 靜態方法也可通過對象訪問:
$p1->myCountry();

// 子類中輸出成員屬性值
echo Student::$country."
"; // 輸出:中國
$t1 = new Student();
$t1->study(); // 輸出:我是中國人
?>

運行該例子,輸出:

中國
我是中國人
我是中國人
中國
我是中國人
小結
在類內部訪問靜態成員屬性或者方法,使用 self::(注意不是 $slef),如:

代碼如下 複製代碼
slef:: $country
slef:: myCountry()

在子類訪問父類靜態成員屬性或方法,使用 parent::(注意不是 $parent),如:

代碼如下 複製代碼
parent:: $country
parent:: myCountry()

外部存取靜態成員屬性和方法為 類名/子類名:: ,如:

代碼如下 複製代碼
Person::$country
Person::myCountry()
Student::$country

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


例子 聲明靜態變數

代碼如下 複製代碼

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;
}
?>

例子 使用靜態變數的例子

代碼如下 複製代碼
function Test()
{
static $w3sky = 0;
echo $w3sky;
$w3sky++;
}
?>

現在,每次調用 Test() 函數都會輸出 $w3sky 的值並加一。


靜態變數也提供了一種處理遞迴函式的方法。遞迴函式是一種調用自己的函數。寫遞迴函式時要小心,因為可能會無窮遞迴下去。必須確保有充分的方法來中止遞迴。一下這個簡單的函數遞迴計數到 10,使用靜態變數 $count 來判斷何時停止:

例子 靜態變數與遞迴函式

代碼如下 複製代碼

function Test()
{
static $count = 0;

$count++;
echo $count;
if ($count < 10) {
Test();
}
$count--;
}
?>

注: 靜態變數可以按照上面的例子聲明。如果在聲明中用運算式的結果對其賦值會導致解析錯誤。

更多關於php靜態變數用法


http://www.bkjia.com/PHPjc/444700.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/444700.htmlTechArticlestatic 是定義一個靜態對象或靜態變數,關於static 定義的變數或類方法有什麼特性我們看完本文章的相關執行個體後就見分曉了。 1. 建立對象$...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.