php中靜態類與靜態變數用法的區別分析

2022-10-06 11:06:11 字數 2208 閱讀 3850

1. 建立物件$object = new class(),然後使用」->」呼叫:$object->attribute/function,前提是該變數/方法可訪問.

2. 直接呼叫類方法/變數:class::attribute/function,無論是靜態/非靜態都可以,但是有前提條件.

a. 如果是變數,需要該變數可訪問.

b. 如果是方法,除了該方法可訪問外,還需要滿足.

① 如果是靜態方法,沒有特殊條件.

② 如果是非靜態方法,需要改方法中沒有使用$this,即沒有呼叫非靜態的變數/方法,當然,呼叫靜態的變數/方法沒有問題.

然後我們再看一下使用$object->… 和使用class::… 都有什麼區別:

1. 使用$object->… ,需要執行建構函式建立物件.

2. 使用class::… 呼叫靜態方法/變數,不需要執行建構函式建立物件.

3. 使用class::… 呼叫非靜態方法/變數,也不需要執行建構函式建立物件.

然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變數存在還有什麼意義呢?

靜態static:宣告類成員或方法為 static,就可以不例項化類而直接訪問,不能通過乙個物件來訪問其中的靜態成員(靜態方法除外),靜態成員屬於類,不屬於任何物件例項,但類的物件例項都能共享.

例子,**如下:

複製** **如下:

<?php

class person

} class student extends person

} // 輸出成員屬性值

echo person::$country."

";  // 輸出:中國

$p1 = new person();

//echo $p1->country;   // 錯www.cppcns.com誤寫法

// 訪問靜態成員方法

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

但靜態方法也可以通過普通物件的方式訪問.

例子,宣告靜態變數,**如下:

複製** **如下:

<?php

function foo()

?>

例子,使用靜態變數的例子,**如下:

複製** **如下:

<?php

function test()

?>

現在,每次呼叫 test() 函式都會輸出 $w3sky 的值並加一.

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

例子,靜態變數與遞迴函式,**如下:

複製** **如下:

<?php

function test()

$count--;

} ?>

注:靜態變數可以按照上面的例子宣告,如果在宣告中用表示式的結果對其賦值會導致解析錯誤.

本文標題: php中靜態類與靜態變數用法的區別分析

本文位址:

PHP類的靜態方法和靜態變數

在php中,訪問類的方法 變數有兩種方法 1.建立物件 object new class 然後使用 呼叫 object attribute function,前提是該變數 方法可訪問。2.直接呼叫類方法 變數 class attribute function,無論是靜態 非靜態都可以。但是有前提條件...

php靜態變數

在函式執行完後,變數值仍然儲存,並沒有變回初始設定的值0。function test test test test 結果 1 23可以發現a設定靜態變數之後,每次 a的值都儲存下來了。我剛開始還以為這個變數變成了全域性變數,測試發現這個變數 a依然只能在函式裡呼叫,在函式外是不能呼叫的。我們再來看看...

java 靜態變數 與 非靜態變數

一 建立乙個類的物件時 new 類名 時,該類的.class檔案會被載入到一段記憶體中。1.先將該類的.class檔案會被載入到一段記憶體,初始化static屬性和方法,為他們分配空間,以後一直在記憶體中,即使這個物件被銷毀。這就是不建議使用static屬性和方法的原因之一 2.copy其中非sta...