PHP教程9個(gè)實(shí)用的PHP函數(shù)_第1頁
PHP教程9個(gè)實(shí)用的PHP函數(shù)_第2頁
PHP教程9個(gè)實(shí)用的PHP函數(shù)_第3頁
PHP教程9個(gè)實(shí)用的PHP函數(shù)_第4頁
PHP教程9個(gè)實(shí)用的PHP函數(shù)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PHP教程9個(gè)實(shí)用的PHP函數(shù)即使使用PHP多年,也會(huì)偶然發(fā)現(xiàn)一些未曾了解的函數(shù)和功能。其中有些是非常有用的,但沒有得到充分利用。并不是所有人都會(huì)從頭到尾一頁一頁地閱讀手冊和函數(shù)參考!1、任意參數(shù)數(shù)目的函數(shù)你可能已經(jīng)知道,PHP允許定義可選參數(shù)的函數(shù)。但也有完全允許任意數(shù)目的函數(shù)參數(shù)的方法。以下是可選參數(shù)的例子://functionwith2optionalargumentsfunctionfoo($arg1='',$arg2=''){ echo"arg1:$arg1\n"; echo"arg2:$arg2\n";}foo('hello','world');/*prints:arg1:helloarg2:world*/foo();/*prints:arg1:arg2:*/現(xiàn)在讓我們看看如何建立能夠接受任何參數(shù)數(shù)目的函數(shù)。這一次需要使用func_get_args()函數(shù)://yes,theargumentlistcanbeemptyfunctionfoo(){ //returnsanarrayofallpassedarguments $args=func_get_args(); foreach($argsas$k=>$v){ echo"arg".($k+1).":$v\n"; }}foo();/*printsnothing*/foo('hello');/*printsarg1:hello*/foo('hello','world','again');/*printsarg1:helloarg2:worldarg3:again*/2、使用Glob()查找文件許多PHP函數(shù)具有長描述性的名稱。然而可能會(huì)很難說出glob()函數(shù)能做的事情,除非你已經(jīng)通過多次使用并熟悉了它??梢园阉醋魇潜萻candir()函數(shù)更強(qiáng)大的版本,可以按照某種模式搜索文件。//getallphpfiles$files=glob('*.php');print_r($files);/*outputlookslike:Array([0]=>phptest.php[1]=>pi.php[2]=>post_output.php[3]=>test.php)*/你可以像這樣獲得多個(gè)文件://getallphpfilesANDtxtfiles$files=glob('*.{php,txt}',GLOB_BRACE);print_r($files);/*outputlookslike:Array([0]=>phptest.php[1]=>pi.php[2]=>post_output.php[3]=>test.php[4]=>log.txt[5]=>test.txt)*/請注意,這些文件其實(shí)是可以返回一個(gè)路徑,這取決于查詢條件:$files=glob('../images/a*.jpg');print_r($files);/*outputlookslike:Array([0]=>../images/apple.jpg[1]=>../images/art.jpg)*/如果你想獲得每個(gè)文件的完整路徑,你可以調(diào)用realpath()函數(shù):$files=glob('../images/a*.jpg');//appliesthefunctiontoeacharrayelement$files=array_map('realpath',$files);print_r($files);/*outputlookslike:Array([0]=>C:\wamp\www\images\apple.jpg[1]=>C:\wamp\www\images\art.jpg)*/3、內(nèi)存使用信息通過偵測腳本的內(nèi)存使用情況,有利于代碼的優(yōu)化。PHP提供了一個(gè)垃圾收集器和一個(gè)非常復(fù)雜的內(nèi)存管理器。腳本執(zhí)行時(shí)所使用的內(nèi)存量,有升有跌。為了得到當(dāng)前的內(nèi)存使用情況,我們可以使用memory_get_usage()函數(shù)。如果需要獲得任意時(shí)間點(diǎn)的最高內(nèi)存使用量,則可以使用memory_limit()函數(shù)。echo"Initial:".memory_get_usage()."bytes\n";/*printsInitial:361400bytes*///let'suseupsomememoryfor($i=0;$i<100000;$i++){ $array[]=md5($i);}//let'sremovehalfofthearrayfor($i=0;$i<100000;$i++){ unset($array[$i]);}echo"Final:".memory_get_usage()."bytes\n";/*printsFinal:885912bytes*/echo"Peak:".memory_get_peak_usage()."bytes\n";/*printsPeak:13687072bytes*/4、CPU使用信息為此,我們要利用getrusage()函數(shù)。請記住這個(gè)函數(shù)不適用于Windows平臺(tái)。print_r(getrusage());/*printsArray([ru_oublock]=>0[ru_inblock]=>0[ru_msgsnd]=>2[ru_msgrcv]=>3[ru_maxrss]=>12692[ru_ixrss]=>764[ru_idrss]=>3864[ru_minflt]=>94[ru_majflt]=>0[ru_nsignals]=>1[ru_nvcsw]=>67[ru_nivcsw]=>4[ru_nswap]=>0[ru_utime.tv_usec]=>0[ru_utime.tv_sec]=>0[ru_stime.tv_usec]=>6269[ru_stime.tv_sec]=>0)*/這可能看起來有點(diǎn)神秘,除非你已經(jīng)有系統(tǒng)管理員權(quán)限。以下是每個(gè)值的具體說明(你不需要記住這些):ru_oublock:blockoutputoperationsru_inblock:blockinputoperationsru_msgsnd:messagessentru_msgrcv:messagesreceivedru_maxrss:maximumresidentsetsizeru_ixrss:integralsharedmemorysizeru_idrss:integralunshareddatasizeru_minflt:pagereclaimsru_majflt:pagefaultsru_nsignals:signalsreceivedru_nvcsw:voluntarycontextswitchesru_nivcsw:involuntarycontextswitchesru_nswap:swapsru_utime.tv_usec:usertimeused(microseconds)ru_utime.tv_sec:usertimeused(seconds)ru_stime.tv_usec:systemtimeused(microseconds)ru_stime.tv_sec:systemtimeused(seconds)要知道腳本消耗多少CPU功率,我們需要看看‘usertime’和’systemtime’兩個(gè)參數(shù)的值。秒和微秒部分默認(rèn)是單獨(dú)提供的。你可以除以100萬微秒,并加上秒的參數(shù)值,得到一個(gè)十進(jìn)制的總秒數(shù)。讓我們來看一個(gè)例子://sleepfor3seconds(non-busy)sleep(3);$data=getrusage();echo"Usertime:". ($data['ru_utime.tv_sec']+ $data['ru_utime.tv_usec']/1000000);echo"Systemtime:". ($data['ru_stime.tv_sec']+ $data['ru_stime.tv_usec']/1000000);/*printsUsertime:0.011552Systemtime:0*/盡管腳本運(yùn)行用了大約3秒鐘,CPU使用率卻非常非常低。因?yàn)樵谒哌\(yùn)行的過程中,該腳本實(shí)際上不消耗CPU資源。還有許多其他的任務(wù),可能需要一段時(shí)間,但不占用類似等待磁盤操作等CPU時(shí)間。因此正如你所看到的,CPU使用率和運(yùn)行時(shí)間的實(shí)際長度并不總是相同的。下面是一個(gè)例子://loop10milliontimes(busy)for($i=0;$i<10000000;$i++){}$data=getrusage();echo"Usertime:". ($data['ru_utime.tv_sec']+ $data['ru_utime.tv_usec']/1000000);echo"Systemtime:". ($data['ru_stime.tv_sec']+ $data['ru_stime.tv_usec']/1000000);/*printsUsertime:1.424592Systemtime:0.004204*/這花了大約1.4秒的CPU時(shí)間,但幾乎都是用戶時(shí)間,因?yàn)闆]有系統(tǒng)調(diào)用。系統(tǒng)時(shí)間是指花費(fèi)在執(zhí)行程序的系統(tǒng)調(diào)用時(shí)的CPU開銷。下面是一個(gè)例子:$start=microtime(true);//keepcallingmicrotimeforabout3secondswhile(microtime(true)-$start<3){}$data=getrusage();echo"Usertime:". ($data['ru_utime.tv_sec']+ $data['ru_utime.tv_usec']/1000000);echo"Systemtime:". ($data['ru_stime.tv_sec']+ $data['ru_stime.tv_usec']/1000000);/*printsUsertime:1.088171Systemtime:1.675315*/現(xiàn)在我們有相當(dāng)多的系統(tǒng)時(shí)間占用。這是因?yàn)槟_本多次調(diào)用microtime()函數(shù),該函數(shù)需要向操作系統(tǒng)發(fā)出請求,以獲取所需時(shí)間。你也可能會(huì)注意到運(yùn)行時(shí)間加起來不到3秒。這是因?yàn)橛锌赡茉诜?wù)器上同時(shí)存在其他進(jìn)程,并且腳本沒有100%使用CPU的整個(gè)3秒持續(xù)時(shí)間。5、魔術(shù)常量PHP提供了獲取當(dāng)前行號(hào)(__LINE__)、文件路徑(__FILE__)、目錄路徑(__DIR__)、函數(shù)名(__FUNCTION__)、類名(__CLASS__)、方法名(__METHOD__)和命名空間(__NAMESPACE__)等有用的魔術(shù)常量。在這篇文章中不作一一介紹,但是我將告訴你一些用例。當(dāng)包含其他腳本文件時(shí),使用__FILE__常量(或者使用PHP5.3新具有的__DIR__常量)://thisisrelativetotheloadedscript'spath//itmaycauseproblemswhenrunningscriptsfromdifferentdirectoriesrequire_once('fig/database.php');//thisisalwaysrelativetothisfile'spath//nomatterwhereitwasincludedfromrequire_once(dirname(__FILE__).'/config/database.php');使用__LINE__使得調(diào)試更為輕松。你可以跟蹤到具體行號(hào)。//somecode//...my_debug("somedebugmessage",__LINE__);/*printsLine4:somedebugmessage*///somemorecode//...my_debug("anotherdebugmessage",__LINE__);/*printsLine11:anotherdebugmessage*/functionmy_debug($msg,$line){ echo"Line$line:$msg\n";}6、生成唯一標(biāo)識(shí)符某些場景下,可能需要生成一個(gè)唯一的字符串。我看到很多人使用md5()函數(shù),即使它并不完全意味著這個(gè)目的://generateuniquestringechomd5(time().mt_rand(1,1000000));ThereisactuallyaPHPfunctionnameduniqid()thatismeanttobeusedforthis.//generateuniquestringechouniqid();/*prints4bd67c947233e*///generateanotheruniquestringechouniqid();/*prints4bd67c9472340*/你可能會(huì)注意到,盡管字符串是唯一的,前幾個(gè)字符卻是類似的,這是因?yàn)樯傻淖址c服務(wù)器時(shí)間相關(guān)。但實(shí)際上也存在友好的一方面,由于每個(gè)新生成的ID會(huì)按字母順序排列,這樣排序就變得很簡單。為了減少重復(fù)的概率,你可以傳遞一個(gè)前綴,或第二個(gè)參數(shù)來增加熵://withprefixechouniqid('foo_');/*printsfoo_4bd67d6cd8b8f*///withmoreentropyechouniqid('',true);/*prints4bd67d6cd8b926.12135106*///bothechouniqid('bar_',true);/*printsbar_4bd67da367b650.43684647*/這個(gè)函數(shù)將產(chǎn)生比md5()更短的字符串,能節(jié)省一些空間。7、序列化你有沒有遇到過需要在數(shù)據(jù)庫或文本文件存儲(chǔ)一個(gè)復(fù)雜變量的情況?你可能沒能想出一個(gè)格式化字符串并轉(zhuǎn)換成數(shù)組或?qū)ο蟮暮梅椒?,PHP已經(jīng)為你準(zhǔn)備好此功能。有兩種序列化變量的流行方法。下面是一個(gè)例子,使用serialize()和unserialize()函數(shù)://acomplexarray$myvar=array( 'hello', 42, array(1,'two'), 'apple');//converttoastring$string=serialize($myvar);echo$string;/*printsa:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}*///youcanreproducetheoriginalvariable$newvar=unserialize($string);print_r($newvar);/*printsArray([0]=>hello[1]=>42[2]=>Array([0]=>1[1]=>two)[3]=>apple)*/這是原生的PHP序列化方法。然而,由于JSON近年來大受歡迎,PHP5.2中已經(jīng)加入了對(duì)JSON格式的支持。現(xiàn)在你可以使用json_encode()和json_decode()函數(shù)://acomplexarray$myvar=array( 'hello', 42, array(1,'two'), 'apple');//converttoastring$string=json_encode($myvar);echo$string;/*prints["hello",42,[1,"two"],"apple"]*///youcanreproducetheoriginalvariable$newvar=json_decode($string);print_r($newvar);/*printsArray([0]=>hello[1]=>42[2]=>Array([0]=>1[1]=>two)[3]=>apple)*/這將更為行之有效,尤其與JavaScript等許多其他語言兼容。然而對(duì)于復(fù)雜的對(duì)象,某些信息可能會(huì)丟失。8、壓縮字符串在談到壓縮時(shí),我們通常想到文件壓縮,如ZIP壓縮等。在PHP中字符串壓縮也是可能的,但不涉及任何壓縮文件。在下面的例子中,我們要利用gzcompress()和gzuncompress()函數(shù):$string="Loremipsumdolorsitamet,consecteturadipiscingelit.Nuncutelitidmiultriciesadipiscing.Nullafacilisi.Praesentpulvinar,sapienvelfeugiatvestibulum,nulladuipretiumorci,nonultricieselitlacusquisante.Loremipsumdolorsitamet,consecteturadipiscingelit.Aliquampretiumullamcorperurnaquisiaculis.Etiamacmassasedturpistemporluctus.Curabitursednibheuelitmolliscongue.Praesentipsumdiam,consecteturvitaeornarea,aliquamanunc.Inidmagnapellentesquetellusposuereadipiscing.Sednonmimetus,atlaciniaaugue.Sedmagnanisi,ornareinmollisin,mollissednunc.Etiamatjustoinleoconguemollis.Nullaminnequeegetmetushendreritscelerisqueeunonenim.Utmalesuadalacuseunullabibendumideuismodurnasodales.";$compressed=gzcompress($string)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論