在日常开拓中,我们常常遇到这样的问题,即有些PHP问题看似简朴,一说就明,可是一到利用时就踩坑。好比,下面我所列的几条:
由于利用单引号,以“ ”为支解符,利用PHP函数explode支解字符串,不能正常支解。原因:这个涉及到单引号与双引号的区别,在单引号中反斜杠不能被理会。因此,利用explode支解时,假如利用单引号, 会被看成字符串,而不是换行符,所以此时,不能正常支解。
雷同问题尚有字符串中包括{}的环境。在字符串中,要想使利用了{}包括的变量乐成理会,该字符串必需利用双引号。
由于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。
由于正反斜杠的原因,PHP函数basename利用无效我们常常利用PHP函数basename,来从一个包括有指向一个文件的全路径的字符串中获取根基的文件名,可是由于正反斜杠的原因,有时你会发明basename函数无法生效,出格是在window系统和linux系统中切换时。本来,basename函数受操纵系统影响,用在 Windows 中,斜线(/)和反斜线()都可以用作目次脱离符,而在其它情况下只能是斜线(/)。因此,假如你在window系统下利用的反斜线(),那到其他系统时是有问题的。
为制止此影响,最好都利用斜线(/)来作为目次支解符,对付利用了定名空间的环境,最好先利用str_replace函数将反斜线()替换成斜线(/)。
trim系列函数的过多去除trim函数的根基用法是去除最外边的空格、换行符之类的。因为其可选参数,许多人也会将其用于去除UTF8BOM头、文件扩展名等等,好比 ltrim($str, "\xEF\xBB\xBF"); rtrim($str, ".txt"); 。可是很快,就会发明这些函数会多去除了一些对象,好比原来是想去除后缀的,功效 logtext.txt 会酿成了 logte 而不是 logtext。为什么呢?因为后头这个参数的意思不是一个完整字符串,而是字符列表,也就是说会一直查抄最左/最右是否切合此列表的个中一个。
htmlspecialchars 函数默认不转义单引号不少网站都是利用此函数作为通用的输入过滤函数,可是此函数默认环境是不外滤单引号的。这长短常很是地容易造成XSS裂痕。这样的做法和不外滤双引号没太大区别,只要前端写得稍微有点不类型(用了单引号)就会中招。因此,我们用的时候必然要给这个函数加上参数 htmlspecialchars( $data, ENT_QUOTES)
foreach的保存现象利用 foreach($someArr as $someL){ } 之类的用法时,要留意最后的一个 $someL 会一直保存到该函数/要领竣事。而当利用引用的时候 foreach($someArr as &$someL){ }这是以引用来生存,也就是说后头若有利用同一个名字的变量名,将会把原数据改变(就像一个乱用的C指针)。为安详起见,发起每个foreach(尤其是引用的)竣事之后都利用unset把这些变量排除去。
小数(符点数)不能直接较量是否相等好比 if( 0.5+0.2==0.7 ) 的功效是 false。究其原因是因为,PHP是基于C语言的,而C语言由于其二进制符点数的暗示方法,导致不能准确暗示大大都符点数。实际上,险些所有的编程语言都没能准确暗示小数(符点数),这是一个普遍存在的现象,因为这个是 IEEE 754 的缺陷。想要办理此问题,只能另立尺度,好像只有Mathematica办理了此问题。
字符串是否沟通发起用 === 而非 ==