PHP開發的程序員應該清楚,PHP中有很多內置的功能,掌握了它們,可以幫助你在做PHP開發時更加得心應手,本文將分享8個開發必備的PHP功能,個個都非常實用,希望各位PHP開發者能夠掌握。
1、傳遞任意數量的函數參數
我們在.NET或者JAVA編程中,一般函數參數個數都是固定的,但是PHP允許你使用任意個數的參數。下面這個示例向你展示了PHP函數的默認參數:
//兩個默認參數的函數functionfoo($arg1=”,$arg2=”){echo“arg1:$arg1n”;echo“arg2:$arg2n”;}foo(‘hello','world');/*輸出:arg1:helloarg2:world*/foo();/*輸出:arg1:arg2:*/
下面這個示例是PHP的不定參數用法,其使用到了func_get_args()方法:
//是的,形參列表為空functionfoo(){//取得所有的傳入參數的數組$args=func_get_args();foreach($argsas$k=>$v){echo“arg”.($k+1).”:$vn”;}}foo();/*什么也不會輸出*/foo(‘hello');/*輸出arg1:hello*/foo(‘hello',‘world',‘again');/*輸出arg1:helloarg2:worldarg3:again*/
2、使用glob()查找文件
大部分PHP函數的函數名從字面上都可以理解其用途,但是當你看到glob()的時候,你也許并不知道這是用來做什么的,其實glob()和scandir()一樣,可以用來查找文件,請看下面的用法:
//取得所有的后綴為PHP的文件$files=glob(‘*.php');print_r($files);/*輸出:Array([0]=>phptest.php[1]=>pi.php[2]=>post_output.php[3]=>test.php)*/你還可以查找多種后綴名://取PHP文件和TXT文件$files=glob(‘*.{php,txt}',GLOB_BRACE);print_r($files);/*輸出:Array([0]=>phptest.php[1]=>pi.php[2]=>post_output.php[3]=>test.php[4]=>log.txt[5]=>test.txt13.)*/
你還可以加上路徑:
$files=glob(‘../images/a*.jpg');print_r($files);/*輸出:Array([0]=>../images/apple.jpg[1]=>../images/art.jpg)*/
如果你想得到絕對路徑,你可以調用realpath()函數:
$files=glob(‘../images/a*.jpg');//appliesthefunctiontoeacharrayelement$files=array_map(‘realpath',$files);print_r($files);/*outputlookslike:Array([0]=>C:wampwwwimagesapple.jpg[1]=>C:wampwwwimagesart.jpg)*/
3、獲取內存使用情況信息
PHP的內存回收機制已經非常強大,你也可以使用PHP腳本獲取當前內存的使用情況,調用memory_get_usage()函數獲取當期內存使用情況,調用memory_get_peak_usage()函數獲取內存使用的峰值。參考代碼如下:
echo“Initial:“.memory_get_usage().”bytesn”;/*輸出Initial:361400bytes*///使用內存for($i=0;$i<100000;$i++){$array[]=md5($i);}//刪除一半的內存for($i=0;$i<100000;$i++){unset($array[$i]);}echo“Final:“.memory_get_usage().”bytesn”;/*printsFinal:885912bytes*/echo“Peak:“.memory_get_peak_usage().”bytesn”;/*輸出峰值Peak:13687072bytes*/
4、獲取CPU使用情況信息
獲取了內存使用情況,也可以使用PHP的getrusage()獲取CPU使用情況,該方法在windows下不可用。
print_r(getrusage());/*輸出Array([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)*/
這個結構看上出很晦澀,除非你對CPU很了解。下面一些解釋:
ru_oublock:塊輸出操作
ru_inblock:塊輸入操作
ru_msgsnd:發送的message
ru_msgrcv:收到的message
ru_maxrss:最大駐留集大小
ru_ixrss:全部共享內存大小
ru_idrss:全部非共享內存大小
ru_minflt:頁回收
ru_majflt:頁失效
ru_nsignals:收到的信號
ru_nvcsw:主動上下文切換
ru_nivcsw:被動上下文切換
ru_nswap:交換區
ru_utime.tv_usec:用戶態時間(microseconds)
ru_utime.tv_sec:用戶態時間(seconds)
ru_stime.tv_usec:系統內核時間(microseconds)
ru_stime.tv_sec:系統內核時間?(seconds)
要看到你的腳本消耗了多少CPU,我們需要看看“用戶態的時間”和“系統內核時間”的值。秒和微秒部分是分別提供的,您可以把微秒值除以100萬,并把它添加到秒的值后,可以得到有小數部分的秒數。
//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);/*輸出Usertime:0.011552Systemtime:0*/sleep是不占用系統時間的,我們可以來看下面的一個例子://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);/*輸出Usertime:1.424592Systemtime:0.004204*/
這花了大約14秒的CPU時間,幾乎所有的都是用戶的時間,因為沒有系統調用。
系統時間是CPU花費在系統調用上的上執行內核指令的時間。下面是一個例子:
$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*/
我們可以看到上面這個例子更耗CPU。
5、獲取系統常量
PHP提供非常有用的系統常量可以讓你得到當前的行號(__LINE__),文件(__FILE__),目錄(__DIR__),函數名(__FUNCTION__),類名(__CLASS__),方法名(__METHOD__)和名字空間(__NAMESPACE__),很像C語言。
我們可以以為這些東西主要是用于調試,當也不一定,比如我們可以在include其它文件的時候使用?__FILE__(當然,你也可以在PHP5.3以后使用__DIR__),下面是一個例子。
//thisisrelativetotheloadedscript'spath//itmaycauseproblemswhenrunningscriptsfromdifferentdirectoriesrequire_once(‘config/database.php');//thisisalwaysrelativetothisfile'spath//nomatterwhereitwasincludedfromrequire_once(dirname(__FILE__).‘/config/database.php');
下面是使用__LINE__來輸出一些debug的信息,這樣有助于你調試程序:
//somecode//…my_debug(“somedebugmessage”,__LINE__);/*輸出Line4:somedebugmessage*///somemorecode//…my_debug(“anotherdebugmessage”,__LINE__);/*輸出Line11:anotherdebugmessage*/functionmy_debug($msg,$line){echo“Line$line:$msgn”;}
6、生成唯一的id
很多朋友都利用md5()來生成唯一的編號,但是md5()有幾個缺點:1、無序,導致數據庫中排序性能下降。2、太長,需要更多的存儲空間。其實PHP中自帶一個函數來生成唯一的id,這個函數就是uniqid()。下面是用法:
//generateuniquestringechouniqid();/*輸出4bd67c947233e*///generateanotheruniquestringechouniqid();/*輸出4bd67c9472340*/
該算法是根據CPU時間戳來生成的,所以在相近的時間段內,id前幾位是一樣的,這也方便id的排序,如果你想更好的避免重復,可以在id前加上前綴,如:
//前綴echouniqid(‘foo_');/*輸出foo_4bd67d6cd8b8f*///有更多的熵echouniqid(”,true);/*輸出4bd67d6cd8b926.12135106*///都有echouniqid(‘bar_',true);/*輸出bar_4bd67da367b650.43684647*/
7、序列化
PHP序列化功能大家可能用的比較多,也比較常見,當你需要把數據存到數據庫或者文件中是,你可以利用PHP中的serialize()和unserialize()方法來實現序列化和反序列化,代碼如下:
//一個復雜的數組$myvar=array(‘hello',42,array(1,'two'),‘apple');//序列化$string=serialize($myvar);echo$string;/*輸出a: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”;}*///反序例化$newvar=unserialize($string);print_r($newvar);/*輸出Array([0]=>hello[1]=>42[2]=>Array([0]=>1[1]=>two)[3]=>apple)*/
如何序列化成json格式呢,放心,php也已經為你做好了,使用php5.2以上版本的用戶可以使用json_encode()和json_decode()函數來實現json格式的序列化,代碼如下:
//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)*/
8、字符串壓縮
當我們說到壓縮,我們可能會想到文件壓縮,其實,字符串也是可以壓縮的。PHP提供了gzcompress()和gzuncompress()函數:
$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);echo“Originalsize:“.strlen($string).”n”;/*輸出原始大小Originalsize:800*/echo“Compressedsize:“.strlen($compressed).”n”;/*輸出壓縮后的大小Compressedsize:418*///解壓縮$original=gzuncompress($compressed);
幾乎有50%壓縮比率。同時,你還可以使用gzencode()和gzdecode()函數來壓縮,只不用其用了不同的壓縮算法。
以上就是8個開發必備的PHP功能,是不是都很實用呢?
新聞熱點
疑難解答