PHP下10件你也許并不了解的事情
更新時(shí)間:2008年09月11日 19:52:32 作者:
PHP 是我用過(guò)的語(yǔ)言中,最令人惱火的但同時(shí)也是最有趣的語(yǔ)言。我之所以說(shuō)“令人惱火”主要是因?yàn)楹瘮?shù)命名極其不一致。盡管我每天都要用到這些函數(shù),我還是要想一下“究竟是 str_pos 還是 strpos?是 str_split 還是 strsplit?”。
另一方面,有時(shí)候可以用一行簡(jiǎn)單的代碼就能解決一個(gè)難題。
下面是一些很酷的特性,很可能你也沒(méi)有注意到:
使用 ip2long() 和 long2ip() 函數(shù)來(lái)把 IP 地址轉(zhuǎn)化成整型存儲(chǔ)到數(shù)據(jù)庫(kù)里。這種方法把存儲(chǔ)空間降到了接近四分之一(char(15) 的 15 個(gè)字節(jié)對(duì)整形的 4 個(gè)字節(jié)),計(jì)算一個(gè)特定的地址是不是在一個(gè)區(qū)段內(nèi)頁(yè)更簡(jiǎn)單了,而且加快了搜索和排序的速度(雖然有時(shí)僅僅是快了一點(diǎn))。
在驗(yàn)證 email 地址的時(shí)候使用 checkdnsrr() 函數(shù)驗(yàn)證域名是否存在。這個(gè)內(nèi)置函數(shù)能夠確認(rèn)指定的域名能夠解析成 IP 地址。該函數(shù)的PHP 文檔的用戶評(píng)論部分有一個(gè)簡(jiǎn)單的用戶自定義函數(shù),這個(gè)函數(shù)基于 checkdnsrr(),用來(lái)驗(yàn)證 email 地址的合法性。對(duì)于那些認(rèn)為自己的 email 地址是 “joeuser@wwwphp.net” 而不是 “joeuser@php.net” 的家伙們,這個(gè)方法可以很方便的抓住他們。
如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考慮拋棄 mysql_* 系列函數(shù)改用改進(jìn)版的 mysqli_* 系列函數(shù)。一個(gè)很好的功能就是你可以使用預(yù)處理語(yǔ)句,如果你在維護(hù)一個(gè)數(shù)據(jù)庫(kù)密集型站點(diǎn),這個(gè)功能能夠加快查詢速度。一些評(píng)估分?jǐn)?shù)。
學(xué)會(huì)愛(ài)上三元運(yùn)算符。
如果你在項(xiàng)目中感覺(jué)到有可復(fù)用的部分,在你寫(xiě)下一行代碼前先看看 PEAR 中是否已經(jīng)有了。很多 PHP 程序員都知道 PEAR 是一個(gè)很好的資源庫(kù),雖然還有很多程序員不知道。這個(gè)在線資源庫(kù)包含了超過(guò) 400 個(gè)可以復(fù)用的程序片段,這些程序片段你可以立即用刀你的程序里。除非說(shuō)你的項(xiàng)目真的是非常特別的,你總能找到幫你節(jié)省時(shí)間的 PEAR 包。(參見(jiàn) PECL)
用 highlight_file() 來(lái)自動(dòng)的打印出格式化的很漂亮的源代碼。如果你在留言板、IRC 這些地方尋求一個(gè)腳本的幫助的話,這個(gè)函數(shù)用起來(lái)非常的順手。當(dāng)然了,要小心不要意外的泄露出你的數(shù)據(jù)庫(kù)連接信息和密碼等。
使用 error_reporting(0) 函數(shù)來(lái)防止用戶看到潛在的敏感錯(cuò)誤信息。在理想情況下,發(fā)布服務(wù)器應(yīng)該在 php.ini 里完全禁止。但是如果你用的是一個(gè)共享的 web 服務(wù)器的話,你沒(méi)有自己的 php.ini 文件,那么這種情況下你最好的選擇就是在所有腳本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。這就能夠在出錯(cuò)的時(shí)候完全屏蔽敏感的 SQL 查詢語(yǔ)句和路徑名。
在網(wǎng)數(shù)據(jù)庫(kù)中存儲(chǔ)很大的字符串之前使用 gzcompress() 和 gzuncompress() 來(lái)顯式的壓縮/解壓字符串。這個(gè) PHP 內(nèi)置函數(shù)使用 gzip 算法,可以壓縮普通文本達(dá) 90%。在我每次要讀寫(xiě) BLOB 類型的字段的時(shí)候都使用這些函數(shù)。唯一額例外就是當(dāng)我需要全文檢索的時(shí)候。
通過(guò)“引用”傳遞參數(shù)的方法從一個(gè)函數(shù)中得到多個(gè)返回值。就像三元運(yùn)算符一樣,大部分受過(guò)正式編程訓(xùn)練的程序員都知道這個(gè)技巧。但是那些 HTML 背景大于 Pascal 背景的程序員都或多或少的有過(guò)這樣的疑問(wèn)“在僅能使用一次 return 的情況下,從一個(gè)函數(shù)里返回多個(gè)值?”答案就是在變量前加上一個(gè) “&” 符號(hào),通過(guò)“引用”傳遞而非“值”傳遞。
完全理解“魔術(shù)引號(hào)”和 SQL 注入的危險(xiǎn)性。我希望閱讀到這里的開(kāi)發(fā)者都已經(jīng)很對(duì) SQL 注入和了解了。不過(guò)我還是把這條列在這里,是因?yàn)檫@個(gè)確實(shí)有點(diǎn)難以理解。如果你還沒(méi)有聽(tīng)說(shuō)過(guò)這種說(shuō)法,那么把今天剩下的時(shí)間都用來(lái) Google、閱讀吧。
下面是一些很酷的特性,很可能你也沒(méi)有注意到:
使用 ip2long() 和 long2ip() 函數(shù)來(lái)把 IP 地址轉(zhuǎn)化成整型存儲(chǔ)到數(shù)據(jù)庫(kù)里。這種方法把存儲(chǔ)空間降到了接近四分之一(char(15) 的 15 個(gè)字節(jié)對(duì)整形的 4 個(gè)字節(jié)),計(jì)算一個(gè)特定的地址是不是在一個(gè)區(qū)段內(nèi)頁(yè)更簡(jiǎn)單了,而且加快了搜索和排序的速度(雖然有時(shí)僅僅是快了一點(diǎn))。
在驗(yàn)證 email 地址的時(shí)候使用 checkdnsrr() 函數(shù)驗(yàn)證域名是否存在。這個(gè)內(nèi)置函數(shù)能夠確認(rèn)指定的域名能夠解析成 IP 地址。該函數(shù)的PHP 文檔的用戶評(píng)論部分有一個(gè)簡(jiǎn)單的用戶自定義函數(shù),這個(gè)函數(shù)基于 checkdnsrr(),用來(lái)驗(yàn)證 email 地址的合法性。對(duì)于那些認(rèn)為自己的 email 地址是 “joeuser@wwwphp.net” 而不是 “joeuser@php.net” 的家伙們,這個(gè)方法可以很方便的抓住他們。
如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考慮拋棄 mysql_* 系列函數(shù)改用改進(jìn)版的 mysqli_* 系列函數(shù)。一個(gè)很好的功能就是你可以使用預(yù)處理語(yǔ)句,如果你在維護(hù)一個(gè)數(shù)據(jù)庫(kù)密集型站點(diǎn),這個(gè)功能能夠加快查詢速度。一些評(píng)估分?jǐn)?shù)。
學(xué)會(huì)愛(ài)上三元運(yùn)算符。
如果你在項(xiàng)目中感覺(jué)到有可復(fù)用的部分,在你寫(xiě)下一行代碼前先看看 PEAR 中是否已經(jīng)有了。很多 PHP 程序員都知道 PEAR 是一個(gè)很好的資源庫(kù),雖然還有很多程序員不知道。這個(gè)在線資源庫(kù)包含了超過(guò) 400 個(gè)可以復(fù)用的程序片段,這些程序片段你可以立即用刀你的程序里。除非說(shuō)你的項(xiàng)目真的是非常特別的,你總能找到幫你節(jié)省時(shí)間的 PEAR 包。(參見(jiàn) PECL)
用 highlight_file() 來(lái)自動(dòng)的打印出格式化的很漂亮的源代碼。如果你在留言板、IRC 這些地方尋求一個(gè)腳本的幫助的話,這個(gè)函數(shù)用起來(lái)非常的順手。當(dāng)然了,要小心不要意外的泄露出你的數(shù)據(jù)庫(kù)連接信息和密碼等。
使用 error_reporting(0) 函數(shù)來(lái)防止用戶看到潛在的敏感錯(cuò)誤信息。在理想情況下,發(fā)布服務(wù)器應(yīng)該在 php.ini 里完全禁止。但是如果你用的是一個(gè)共享的 web 服務(wù)器的話,你沒(méi)有自己的 php.ini 文件,那么這種情況下你最好的選擇就是在所有腳本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。這就能夠在出錯(cuò)的時(shí)候完全屏蔽敏感的 SQL 查詢語(yǔ)句和路徑名。
在網(wǎng)數(shù)據(jù)庫(kù)中存儲(chǔ)很大的字符串之前使用 gzcompress() 和 gzuncompress() 來(lái)顯式的壓縮/解壓字符串。這個(gè) PHP 內(nèi)置函數(shù)使用 gzip 算法,可以壓縮普通文本達(dá) 90%。在我每次要讀寫(xiě) BLOB 類型的字段的時(shí)候都使用這些函數(shù)。唯一額例外就是當(dāng)我需要全文檢索的時(shí)候。
通過(guò)“引用”傳遞參數(shù)的方法從一個(gè)函數(shù)中得到多個(gè)返回值。就像三元運(yùn)算符一樣,大部分受過(guò)正式編程訓(xùn)練的程序員都知道這個(gè)技巧。但是那些 HTML 背景大于 Pascal 背景的程序員都或多或少的有過(guò)這樣的疑問(wèn)“在僅能使用一次 return 的情況下,從一個(gè)函數(shù)里返回多個(gè)值?”答案就是在變量前加上一個(gè) “&” 符號(hào),通過(guò)“引用”傳遞而非“值”傳遞。
完全理解“魔術(shù)引號(hào)”和 SQL 注入的危險(xiǎn)性。我希望閱讀到這里的開(kāi)發(fā)者都已經(jīng)很對(duì) SQL 注入和了解了。不過(guò)我還是把這條列在這里,是因?yàn)檫@個(gè)確實(shí)有點(diǎn)難以理解。如果你還沒(méi)有聽(tīng)說(shuō)過(guò)這種說(shuō)法,那么把今天剩下的時(shí)間都用來(lái) Google、閱讀吧。
相關(guān)文章
php中計(jì)算中文字符串長(zhǎng)度、截取中文字符串的函數(shù)代碼
在做PHP開(kāi)發(fā)的時(shí)候,由于我國(guó)的語(yǔ)言環(huán)境問(wèn)題,所以我們常常需要對(duì)中文進(jìn)行處理。2011-08-08php中Socket創(chuàng)建與監(jiān)聽(tīng)實(shí)現(xiàn)方法
這篇文章主要介紹了php中Socket創(chuàng)建與監(jiān)聽(tīng)實(shí)現(xiàn)方法,以實(shí)例形式較為詳細(xì)的分析了Socket的創(chuàng)建、連接、初始化及監(jiān)聽(tīng)等技巧,需要的朋友可以參考下2015-01-01PHP 文件上傳進(jìn)度條的兩種實(shí)現(xiàn)方法的代碼
PHP 文件上傳進(jìn)度條的兩種實(shí)現(xiàn)方法的代碼...2007-11-11php實(shí)現(xiàn)遞歸與無(wú)限分類的方法
這篇文章主要介紹了php實(shí)現(xiàn)遞歸與無(wú)限分類的方法,涉及php的遞歸操作技巧,需要的朋友可以參考下2015-02-02PHP內(nèi)置過(guò)濾器FILTER使用實(shí)例
這篇文章主要介紹了PHP內(nèi)置過(guò)濾器FILTER使用實(shí)例,列舉了驗(yàn)證功能和糾錯(cuò)功能的代碼例子來(lái)講解如何使用FILTER,需要的朋友可以參考下2014-06-06php關(guān)聯(lián)數(shù)組快速排序的方法
這篇文章主要介紹了php關(guān)聯(lián)數(shù)組快速排序的方法,涉及php數(shù)組排序的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04總結(jié)PHP中數(shù)值計(jì)算的注意事項(xiàng)
本文將對(duì)PHP中數(shù)據(jù)計(jì)算的一些犯錯(cuò)的點(diǎn)進(jìn)行整理,并給出解決方法,其中包括四舍五入、整數(shù)和小數(shù)相乘除和浮點(diǎn)數(shù)的怪異,有需要的朋友們可以參考借鑒。2016-08-08php cookie 作用范圍–不要在當(dāng)前頁(yè)面使用你的cookie
這兩天在調(diào)試bug的時(shí)候遇到了一個(gè)問(wèn)題,就是頁(yè)面莫名其妙的會(huì)跳轉(zhuǎn)到登陸頁(yè)面2009-03-03