在php中static是一個(gè)靜態(tài)變量,他可以定義函數(shù),變量為全局靜態(tài)變量了,那么我們?cè)诤瘮?shù)或變量前面加上static會(huì)對(duì)函數(shù)與變量產(chǎn)生怎么樣的影響呢,下面我們一起來(lái)看看。
1) 全局變量(外部變量)的說(shuō)明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量,全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式,這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的,而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤。
2) 從以上分析可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期,把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。
3) static函數(shù)與普通函數(shù)作用域不同,僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個(gè)頭文件中說(shuō)明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件
PHP5.3.0之后,我們可以用一個(gè)變量來(lái)動(dòng)態(tài)調(diào)用類,但該變量的值不能為關(guān)鍵字self,parent或static。
Example #1 靜態(tài)成員代碼示例:
Example #2 靜態(tài)方法代碼示例:
關(guān)于Static關(guān)鍵字在類中的使用,PHP手冊(cè)給出了如下的約定:
1、聲明類成員或方法為static,就可以不實(shí)例化類而直接訪問(wèn)。不能通過(guò)一個(gè)對(duì)象來(lái)訪問(wèn)其中的靜態(tài)成員(靜態(tài)方法除外)。
2、由于靜態(tài)方法不需要通過(guò)對(duì)象即可調(diào)用,所以偽變量$this在靜態(tài)方法中不可用。
3、靜態(tài)屬性不可以由對(duì)象通過(guò)->操作符來(lái)訪問(wèn)。
4、用::方式調(diào)用一個(gè)非靜態(tài)方法會(huì)導(dǎo)致一個(gè)E_STRICT級(jí)別的錯(cuò)誤。
現(xiàn)在來(lái)關(guān)注一下第4條約定。
運(yùn)行環(huán)境:(Win32) PHP/5.3.3,代碼如下:
面試題之static關(guān)鍵字
題目代碼:寫(xiě)出以下代碼的運(yùn)算結(jié)果( ),代碼如下:
第一眼以為就是簡(jiǎn)單地自加計(jì)算:以為結(jié)果是400,結(jié)果答案錯(cuò)誤。最后仔細(xì)看了下,敲了一邊代碼,運(yùn)行才知道是500。打印了兩次$i+=$n;計(jì)算之前的$i,一次是100,一次是200;知道問(wèn)題是static在做鬼。然后百度了一下static關(guān)鍵字,才恍然大悟。
static關(guān)鍵字作用:
PHP中static變量的使用范圍要更廣一些,我們不僅可以在類,方法或變量前面添加 static修飾符,我們甚至還能給函數(shù)內(nèi)部變量添加static關(guān)鍵字,添加了static修飾符的變量即使在該函數(shù)執(zhí)行完畢值仍然不會(huì)丟失,也就是說(shuō),在下一次調(diào)用這個(gè)函數(shù)時(shí),變量仍然記得原來(lái)的值,實(shí)例代碼如下:
運(yùn)行結(jié)果如下:3 5 7
綜上所述:
static全局變量與普通的全局變量有什么區(qū)別:
static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區(qū)別:
static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別:
static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝