static是定義一個靜態對象或靜態變量,關于static 定義的變量或類方法有什么特性我們看完本文章的相關實例后就見分曉了.
1. 創建對象$ob ject = new Class(),然后使用”->”調用:$ob ject->attribute/function,前提是該變量/方法可訪問.
2. 直接調用類方法/變量:class::attribute/function,無論是靜態/非靜態都可以,但是有前提條件.
A. 如果是變量,需要該變量可訪問.
B. 如果是方法,除了該方法可訪問外,還需要滿足.
① 如果是靜態方法,沒有特殊條件.
② 如果是非靜態方法,需要改方法中沒有使用$this,即沒有調用非靜態的變量/方法,當然,調用靜態的變量/方法沒有問題.
然后我們再看一下使用$ob ject->… 和使用class::… 都有什么區別:
1. 使用$ob ject->… ,需要執行構造函數創建對象.
2. 使用class::… 調用靜態方法/變量,不需要執行構造函數創建對象.
3. 使用class::… 調用非靜態方法/變量,也不需要執行構造函數創建對象.
然后奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變量存在還有什么意義呢?
靜態static:聲明類成員或方法為 static,就可以不實例化類而直接訪問,不能通過一個對象來訪問其中的靜態成員(靜態方法除外),靜態成員屬于類,不屬于任何對象實例,但類的對象實例都能共享.
例子,代碼如下:
[代碼]php代碼:
01<?php
02Class Person{
03 // 定義靜態成員屬性
04 public static $country = "中國";
05 // 定義靜態成員方法
06 public static f
07 // 內部訪問靜態成員屬性
08 echo "我是".self::$country."人<br />";
09 }
10}
11class Student extends Person {
12 function study() {
13 echo "我是". parent::$country."人<br />";
14 }
15}
16// 輸出成員屬性值
17echo Person::$country."<br />"; // 輸出:中國
18$p1 = new Person();
19//echo $p1->country; // 錯誤寫法
20// 訪問靜態成員方法
21Person::myCountry(); // 輸出:我是中國人
22// 靜態方法也可通過對象訪問:
23$p1->myCountry();
24
25// 子類中輸出成員屬性值
26echo Student::$country."<br />"; // 輸出:中國
27$t1 = new Student();
28$t1->study(); // 輸出:我是中國人
29?>
運行該例子,輸出:
中國
我是中國人
我是中國人
中國
我是中國人
小結:在類內部訪問靜態成員屬性或者方法,使用 self::(注意不是 $slef),代碼如下:
slef:: $country
slef:: myCountry()
在子類訪問父類靜態成員屬性或方法,使用 parent::(注意不是 $parent),代碼如下:
parent:: $country
parent:: myCountry()
外部訪問靜態成員屬性和方法為 類名/子類名::,代碼如下:
新聞熱點
疑難解答