本文目錄一覽:
- 1、PHP類的靜態(static)方法和靜態(static)變數使用介紹
- 2、php中static 靜態變數和普通變數的區別
- 3、什麼時候該使用PHP的static屬性和方法
- 4、php static 方法有什麼好處
- 5、php 類中的static有什麼作用
- 6、php static和const
PHP類的靜態(static)方法和靜態(static)變數使用介紹
在php中,訪問類的方法/變數有兩種方法:
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都一樣,那靜態方法/變數存在還有什麼意義呢?
差異還是顯然存在的,如下:
1.
靜態變數
靜態成員只保留一個變數值,而這個變數值對所有的實例都是有效,也就是說,所有的實例共享這個成員。
2.
靜態方法
靜態方法可以直接使用class::…
來調用,而非靜態方法需要滿足一定限制條件才能使用class::..
的方法調用,如之前所述
php中static 靜態變數和普通變數的區別
static變數和普通變數的區別:
static全局變數與普通全局變數區別:static全局變數只初使化一次,防止在其他文件單元中被引用;
static局部變數和普通局部變數區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝。
具體的可以看下這篇文章,希望對你有幫助
什麼時候該使用PHP的static屬性和方法
static在使用上,有兩種基本模式:
function test() {
static $prop;
}
class Test {
public static $prop;
}
function裡面的static,更像是function的一個私有屬性。function的static,只在該function內可見,對外是無法訪問到的。
類static,就不用解釋了。一個Class,在未實例化時,只存在靜態方法和靜態屬性。Class的static,是可被外部訪問的(私有或保護屬性,可通過介面訪問)。
static賦值,等號右邊只能賦值靜態常量、數組結構、字元串、數字。
function test() {
static $prop1 = [];
static $prop2 = PHP_SAPI;
static $prop3 = ‘prop3’;
static $prop4 = empty($_SERVER[‘HTTP_HOST’]); // 錯誤
static $prop5 = $_SERVER[‘HTTP_HOST’]; // 也錯誤
}
php static 方法有什麼好處
1、static方法就相當於普通的方法一模一樣,但是給方法分了個類。語義化代碼。
2、實例化class時不會重新將static方法聲明第二遍
比如:
class People{
private $name;
public __construct($name = “”){
$this-name = $name;
}
//此方法就不適合用static方法,因為他要使用實例的成員變數name
public function sayMyName(){
echo “My name is “.$this-name;
}
//類似這種方法的就最好寫成static方法
public static function isMe($obj){
return get_class($obj) == “People” ? true : false;
}
}
$me = new People(“s524797336”);
$me-sayMyName();//輸出s524797336
var_dump(People::isMe($me));//輸出bool true
//其實如果直接有個方法如下,他的作用跟static方法作用其實是一樣的
function isPeople($obj){
return get_class($obj) == “People” ? true : false;
}
var_dump(isPeople($me));//輸出bool true
總而言之,他就是將普通方法封裝到了類裡面,就像上面,放到people類裡面就是isMe,在公用的裡面就是isPeople,雖然完成的事情是一樣的,但是意義不同
你可以把static方法當成某個class中的共用方法
php 類中的static有什麼作用
static 是C中很常用的修飾符,它被用來控制變數的存儲方式和可見性
static 聲明的變數在C語言中有兩方面的特徵:
1)、變數會被放在程序的全局存儲區中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2)、變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全局變數的區別。
2、問題:Static的理解
關於static變數,請選擇下面所有說法正確的內容:
A、若全局變數僅在單個C文件中訪問,則可以將這個變數修改為靜態全局變數,以降低模塊間的耦合度;
B、若全局變數僅由單個函數訪問,則可以將這個變數改為該函數的靜態局部變數,以降低模塊間的耦合度;
C、設計和使用訪問動態全局變數、靜態全局變數、靜態局部變數的函數時,需要考慮重入問題;
D、靜態全局變數過大,可那會導致堆棧溢出。
答案與分析:
對於A,B:根據本篇概述部分的說明b),我們知道,A,B都是正確的。
對於C:根據本篇概述部分的說明a),我們知道,C是正確的(所謂的函數重入問題,下面會詳細闡述)。
對於D:靜態變數放在程序的全局數據區,而不是在堆棧中分配,所以不可能導致堆棧溢出,D是錯誤的。
因此,答案是A、B、C。
3、問題:不可重入函數
曾經設計過如下一個函數,在代碼檢視的時候被提醒有bug,因為這個函數是不可重入的,為什麼?
unsigned int sum_int( unsigned int base )
{
unsigned int index;
static unsigned int sum = 0; // 注意,是static類型的。
for (index = 1; index = base; index++)
{
sum += index;
}
return sum;
}
答案與分析:
所謂的函數是可重入的(也可以說是可預測的),即:只要輸入數據相同就應產生相同的輸出。
這個函數之所以是不可預測的,就是因為函數中使用了static變數,因為static變數的特徵,這樣的函數被稱為:帶「內部存儲器」功能的的函數。因此如果我們需要一個可重入的函數,那麼,我們一定要避免函數中使用static變數,這種函數中的static變數,使用原則是,能不用盡量不用。
將上面的函數修改為可重入的函數很簡單,只要將聲明sum變數中的static關鍵字去掉,變數sum即變為一個auto 類型的變數,函數即變為一個可重入的函數。
當然,有些時候,在函數中是必須要使用static變數的,比如當某函數的返回值為指針類型時,則必須是static的局部變數的地址作為返回值,若為auto類型,則返回為錯指針。
php static和const
靜態的常量字元指針。
一個靜態的、值不能被改變的整型常量。靜態變數與全局變數差不多,就是函數執行完畢之後,這個變數的值仍然保留,下次調用該函數時,這個變數的值仍然存在。
const 是常量,即從程序運算開始到結束,數值不變的量。
static 用於變數,聲明這個變數的存儲單元靜態分配,從程序運算開始到結束這個變數的存儲單元不變化。static常用於全局量,一是存在裡面的值始終有效,不因進退出子程序數值消失,另外static的變數運算速度比非靜態分配的快。
常量是不出現在等號左邊的。例如輸出輸入格式里的字元串就是常量,程序里直接寫入的數據也是常量。
y = a * x + 300.0; 300.0 是常量. 常量在電腦里也被分配存放單元的,但值不可變。
百度貼吧里有好些吧是有關編程的。貼吧就是論壇–Forum 啊。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/197044.html