成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

「PHP編程」PHP中的這些坑,你沒踩過算你厲害

開發 后端
在日常開發中,我們經常碰到這樣的問題,即有些PHP問題看似簡單,一說就明,但是一到使用時就踩坑。

[[238593]]

在日常開發中,我們經常碰到這樣的問題,即有些PHP問題看似簡單,一說就明,但是一到使用時就踩坑。比如,下面我所列的幾條:

1、由于使用單引號,以“ ”為分割符,使用PHP函數explode分割字符串,不能正常分割。

原因:這個涉及到單引號與雙引號的區別,在單引號中反斜杠不能被解析。因此,使用explode分割時,如果使用單引號, 會被當作字符串,而不是換行符,所以此時,不能正常分割。

類似問題還有字符串中包含{}的情況。在字符串中,要想使使用了{}包含的變量成功解析,該字符串必須使用雙引號。

2、由于BOM頭,使用PHP函數json_decode解析json字符串,不能解析成功。

原因:UTF-8 編碼的文件可以分為無 BOM 和 BOM 兩種格式。何謂BOM? "EF BB BF" 這三個字節就叫BOM,BOM的全稱叫做"Byte Order Mard"。在utf-8文件中常用BOM來表明這個文件是UTF-8文件,而BOM的本意實在utf16中用來表示高低字節序列的。在字節流之前有 BOM表示采用低字節序列(低字節在前面),而utf8不用考慮字節序列,所以其實有無BOM都可以。UTF-8以字節為編碼單元,沒有字節序的問題。 UTF-16以兩個字節為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節序。例如收到一個“奎”的Unicode編碼是 594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16字節流“594E”,那么這是 “奎”還是“乙”?

如果文件保 存時,選擇了使用 BOM,會使頁面顯示不正常。一般來說,php是不支持有BOM的,php文件應該保存為UTF-8無BOM類型,所以在保存 UTF8 編碼PHP文件時,不要使用 BOM。

3、由于正反斜杠的原因,PHP函數basename使用無效

我們經常使用PHP函數basename,來從一個包含有指向一個文件的全路徑的字符串中獲取基本的文件名,但是由于正反斜杠的原因,有時你會發現basename函數無法生效,特別是在window系統和linux系統中切換時。原來,basename函數受操作系統影響,用在 Windows 中,斜線(/)和反斜線()都可以用作目錄分隔符,而在其它環境下只能是斜線(/)。因此,如果你在window系統下使用的反斜線(),那到其他系統時是有問題的。

為避免此影響,***都使用斜線(/)來作為目錄分割符,對于使用了命名空間的情況,***先使用str_replace函數將反斜線()替換成斜線(/)。

4、trim系列函數的過多去除

trim函數的基本用法是去除最外邊的空格、換行符之類的。因為其可選參數,很多人也會將其用于去除UTF8BOM頭、文件擴展名等等,比如 ltrim($str, "\xEF\xBB\xBF"); rtrim($str, ".txt"); 。但是很快,就會發現這些函數會多去除了一些東西,比如本來是想去除后綴的,結果 logtext.txt 會變成了 logte 而不是 logtext。為什么呢?因為后面這個參數的意思不是一個完整字符串,而是字符列表,也就是說會一直檢查最左/最右是否符合此列表的其中一個。

5、htmlspecialchars 函數默認不轉義單引號

不少網站都是使用此函數作為通用的輸入過濾函數,但是此函數默認情況是不過濾單引號的。這是非常非常地容易造成XSS漏洞。這樣的做法和不過濾雙引號沒太大區別,只要前端寫得稍微有點不規范(用了單引號)就會中招。因此,我們用的時候一定要給這個函數加上參數 htmlspecialchars( $data, ENT_QUOTES)

6、foreach的保留現象

使用 foreach($someArr as $someL){ } 之類的用法時,要注意***的一個 $someL 會一直保留到該函數/方法結束。而當使用引用的時候 foreach($someArr as &$someL){ }這是以引用來保存,也就是說后面若有使用同一個名字的變量名,將會把原數據改變(就像一個亂用的C指針)。為安全起見,建議每個foreach(尤其是引用的)結束之后都使用unset把這些變量清除掉。

7、小數(符點數)不能直接比較是否相等

比如 if( 0.5+0.2==0.7 ) 的結果是 false。究其原因是因為,PHP是基于C語言的,而C語言由于其二進制符點數的表示方式,導致不能精確表示大多數符點數。實際上,幾乎所有的編程語言都沒能精確表示小數(符點數),這是一個普遍存在的現象,因為這個是 IEEE 754 的缺陷。想要解決此問題,只能另立標準,似乎只有Mathematica解決了此問題。

8、字符串是否相同建議用 === 而非 ==

為什么呢?因為這個比較是弱類型。兩個比較時,PHP會先嘗試判別左右兩者是否為數字。而問題就在于什么樣的字符串是數字,是單純的數字串嗎?遠遠不只于此,還包括 0x 開頭的十六進制,XXeX類型的科學記數法 等等,如 '12e0'=='0x0C' 得到的是true。而在數值類型與字符串比較時,甚至一些數字開頭的非數值串,比如 12=='12這個串' 得到的值也會是 true。

所以這些情況下,可能會使本來并不相同的字符串被判定為相等。而使用===比較則為包含類型的比較,不會有任何轉換,所以是可以準確比較字符串是否相同的。

另外吐槽一下JAVA,==居然比較不了字符串是否相等,因為字符串是一個對象,==變成了判斷是否為同一個對象……

9、不能把switch中的case當作if來使用

在PHP函數switch……case中,switch 匹配的是case語句的值,而不能把case當if用。同時,switch表達式優先匹配與其值類型一致的case語句,類型不一致的放在后面處理,如下:

10、strrchr函數是查找某個字符,而不是查找字符串

在PHP手冊上strrchr() 函數的解釋是查找字符串在另一個字符串中***一次出現的位置,并返回從該位置到字符串結尾的所有字符。如果成失敗,否則返回 false。實際上,這個函數是查找某個字符,而不是查找字符串。如下示例,很多人一開始肯定以為返回false,但實際上并不是。

上面示例說明,如果$b是字符串,只使用***個字符,后面的其它字符會忽略。

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2018-09-11 09:14:52

面試公司缺點

2023-03-13 13:36:00

Go擴容切片

2024-04-01 08:05:27

Go開發Java

2025-04-15 02:00:00

API版本項目

2018-01-10 06:17:24

2025-04-29 10:17:42

2021-04-14 17:34:18

線程安全

2018-04-08 22:16:21

2022-04-26 21:49:55

Spring事務數據庫

2017-07-17 15:46:20

Oracle并行機制

2015-10-26 09:19:28

PHP經驗

2019-12-12 14:32:26

SQL語句數據庫

2022-07-06 11:47:27

JAVAfor循環

2018-01-10 13:40:03

數據庫MySQL表設計

2017-11-17 09:35:00

筆記本CPU中央處理器

2023-01-18 23:20:25

編程開發

2024-05-06 00:00:00

緩存高并發數據

2015-03-24 16:29:55

默認線程池java

2019-10-25 22:17:25

開發者技能工具

2018-07-30 16:18:51

容災備份
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费网视频 | 欧美一区二区三区在线 | 日韩av成人在线 | 中文字幕电影在线观看 | 在线一级片 | 亚洲成年在线 | 中文字幕在线一区 | 91久久久久久久久久久久久 | 91成人在线视频 | 韩日精品一区 | 国产成人a亚洲精品 | av大片 | 毛片黄片免费看 | 欧美日韩在线免费观看 | 91精品久久久 | 日本黄色激情视频 | 亚洲一区二区三区四区五区午夜 | 三级在线视频 | 日韩毛片在线观看 | 国产成人精品久久二区二区91 | 亚洲精品久久久久久久不卡四虎 | 一区中文 | 91精品国产91久久久 | 亚洲区一区二区 | 91欧美精品 | 视频在线日韩 | 成人欧美一区二区三区在线观看 | 日本视频在线播放 | 欧美日韩国产在线观看 | 国产美女在线播放 | 日韩免费av网站 | 国产综合在线视频 | 日本中出视频 | 日韩一区二区福利视频 | 亚洲一卡二卡 | 久久久免费毛片 | 久久777| 久久精品国产一区二区电影 | 二区在线观看 | 午夜大片 | 久久剧场 |