




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、前百在一次偶然查看PHP文檔的時候,發(fā)現(xiàn)了一些有趣的內(nèi)容,隨著閱讀的增加, 越覺察得有趣的內(nèi)容或者說時坑越來越多,所以我決定記錄下來,提供出去,下 文中一些內(nèi)容摘錄自一些優(yōu)秀的博客、PHP文檔的用戶筆記,或者文檔原文。尤其是文檔原文,我發(fā)現(xiàn)很多人不會去讀,很多東西也不會去注意(是的,我也 是這樣,所以借著這次機會,一起來學(xué)習(xí)一下。)我忘了 PHP函數(shù)的參數(shù)順序,它們是隨機的嗎?PHP is a glue that brings together hundreds of external libraries, so sometimes this gets messy. However, a si
2、mple rule of thumb is as follows:Array functionparameters are ordered as needle, haystack whereas String functionsare the opposite, so haystack, needle.譯:數(shù)組相關(guān)方法的參數(shù)順序為,needle, haystack,字符串相關(guān)方法那么是相 反的haystack, needlej ,來源:我應(yīng)該如何保存“鹽” ?當(dāng)使用password_hash()或者crypt()函數(shù)時,鹽會被作為生成的散列值的一 局部返回。你可以直接把完整的返回值存儲到數(shù)據(jù)庫
3、中,因為這個返回值中已 經(jīng)包含了足夠的信息,可以直接用在password_verify()或crypt()函數(shù)來進行 密碼驗證。下列圖展示了 crypt()或password_hash()函數(shù)返回值的結(jié)構(gòu)。如你所見,算法 的信息以及鹽都已經(jīng)包含在返面值中,在后續(xù)的密碼驗證中將會用到這些信,息、O$2y$10$6z7GKa9kpDN7KC3ICWlHlBfdO/to7Y/x36WUKNPQIndHdkdR9Ae3KSaltHashed password-Algorithm options (eg cost)Algorithm聽起來沒什么用但是你確實可以這樣做。fa = Hi!1;/在PHP 7.
4、2以下,這行代碼會返回八7.2 7.4會返回NULL,但是會提示被遺棄, 8Q 開始,將不再支持除此之外,你還可以用settype函數(shù)參考:參考: s:/ /manual/zh/function.unset.php#example-5601isset和unset同時支持多個參數(shù)unset支持多個參數(shù),想必大多數(shù)人是知道的,但是isset也支持喲。?phpva r_diA isseta,也 $c);tms況(弧場于c);你不需要擔(dān)憂這幾個變量沒有被設(shè)置,他們在這里都是平安的,不會報錯,在 isset多個變量時,必須要所有變量都不為八M時,才會返回true,當(dāng)遇到一個不 存在時,將會立即返回。參考
5、:快速查詢一個函數(shù)或者類或語法的參考當(dāng)你要查詢一個php方法或者對象或者語法時,你不需要翻開php手冊進行 搜索,你只需要在kttps:/p.八后面跟上方法、語法、對象的名字即 可,并且不需要關(guān)心大小i額,比方像下面這些鏈接。 s:/curlfile s:/isset s:/if使用反射調(diào)用protected或者private的類方法如果想防止一個方法被外部可見或者子類可見,可以采用protected或者 private關(guān)鍵字來修改這些類,但是我們有時候又想在外部調(diào)用這些方法,應(yīng)該 怎么辦呢?只能改成public嗎?如果這是我們自己的代碼,當(dāng)然可以這樣做, 但是如果是引入的外部代碼的話,可能就
6、不太好直接修改了?,F(xiàn)在,我們可以在外部使用反射來調(diào)用這些方法,現(xiàn)在我們來定義一個Usa類class Lisapublic fix八cti。八八return Lis*)protected fix八cti。八 age。return 22;)private fix八ctio八 weight。return 9S;)private static fimctio八 eatQ)(return 1;通常情況下,我們是沒有方法直接調(diào)用age和weight方法的,現(xiàn)在,我們使 用反射來調(diào)用。geMetkod(Zg/); / 獲取 age 方法$”geMekod-seAccessib/e(tKe); /設(shè)置可見性/
7、調(diào)用這個方法,需要傳入對象作為上下文芋nge =串a(chǎn)geMethod-ioke(reflectionClass -new次st4八ccO)4QdHA?(于ge);/ 22 上面的代碼看起來有些繁瑣,還有一個更簡單的方法。?php/ .*ef(ccti。八Class = mw Rcf/ccti。八assCLk4);$wcigktM況kod =新eflcctio八ClaOgetMetkoclCwcight;/獲取 weight方法 獲取一個閉包,然后調(diào)用,同樣需要傳入對象作為上下文,后面調(diào)用的地方就可以傳入?yún)?shù)于weight =$weiglgetClou(re($reflectioiC(ass-i
8、newltaiceQWvar_diAKvp($weightY 調(diào)用靜態(tài)方法?php/ 軻eflecti。八Class = new Reflecti。八C(ass(Lisa、輪atMethod gctMctkodCct);$catMctkod-sctAcccssib/c(trc);$cat =$eatMethod-iyvoke(iull / 如果是一個靜態(tài)方法,你可以傳遞一個 八同樣,類成員也可以使用反射進行修改。參考:實例化一個類,但是繞過他的構(gòu)造方法有沒有這樣想過?實例化一個類,但是卻不想調(diào)用他的構(gòu)造方法(construct), 這里也可以用反射做到。n4MC =$h ai4/c;)publ
9、ic fixACti。八 get Name。return 于麗s-八)*dogClass = new Ref lectio八Class(Dog);/創(chuàng)立一個新實例,但是不調(diào)用構(gòu)造方法$4。shmcc二,dogC/ass-八ew伉s4八ccWithoutCo八stKuctorOw41cd3?($dog伉sta八ce-getNhcO); / 八 如果你的環(huán)境不能使用反射,你還可以試試另一個很cool的方法,就是使用反 序列化,可以參考包 doctrine/instantiator - Packagist參考: or.php獲取類一個類的所有父類使用腦核步甌以區(qū)可以獲取一個類的所有父類,并且支持自動
10、加載。stn八g(:L) C3 =strMg(H) B4 =stnhg(2) A參考:有趣的遞增和遞減遞增遞減不能作用域bool值遞增、遞減不能使用在false上面,但是十二和-二可以?php fa = false;fakem也由叫false-$4;岬($);/ fake$4-;var_diA;/ fake刎-二1;var_d(Aip($a);/ -1%十=1;/因為前面改變了,變成了 -工,所以下面是O ,請不要在這里疑惑var_diAvp(fd);/ O遞增可以作用域NULL,但是遞減不可以?php=八化/I$a =八川;一于兄心匕/出?($4); /八遞增可以作用于字母,但是遞減不可以a
11、-y遞增時字母都將向后增加一個,但是當(dāng)z的時候,就將會回到aa ,循環(huán)如 此,但是只能遞增,不能遞減 A廿= A2= A3= OA +$4= OB= uoorcu= A。= AOO2 +$4= AOO2 +$= AOOy但是請注意一些意外情況,比方這樣。 M= 3EO +*“= 0.0這是因為9E0被當(dāng)作成了浮點數(shù)的字符串表示,被PHP當(dāng)成了 9*10A0 ,被評 估成了 9 ,然后在執(zhí)行的遞增。參考來源:.請注意你的嵌套強制類型轉(zhuǎn)換,否那么他會發(fā)生意外var_d(Aip(TRUE = (boolean) (airray) (Mt) FALSE);/ truevar_diAvp(array f
12、/kt) FALSE);因為當(dāng)把FALSE轉(zhuǎn)為數(shù)字是,他是0,再轉(zhuǎn)為數(shù)組后,就成了,QJ,所以再轉(zhuǎn)為boolean時,將會返回true,因為數(shù)組不為空,并且回仁口 參考: s:/ /manual/zh/language.types.type-juggling.php#115373高版本中的數(shù)字與字符串進行比擬自PHP 8.0開始。數(shù)字與非數(shù)字形式的字符串之間的非嚴(yán)格比擬現(xiàn)在將首先將數(shù)字 轉(zhuǎn)為字符串,然后比擬這兩個字符串。數(shù)字與數(shù)字形式的字符串 之間的比擬仍然像之前那樣進行。請注意,這意味著0 = z/not-a-numberz/ 現(xiàn)在將被認(rèn)為是 false。ComparisonBeforeAf
13、ter0 = 0truetrue0 = 0. 0truetrue0 = footruefalse0 = truefalse42 = 42truetrue42 = 42footruefalse琴節(jié): s:/ /manual/zh/migration80.incompatible.php#migration80.incom patible.core數(shù)組也可以直接比擬你可以直接使用二二比擬兩個數(shù)組有相同的鍵值對,如果這不是一個關(guān)聯(lián)數(shù)組, 那么就要保證值的順序相對應(yīng),如果時一個關(guān)聯(lián)數(shù)組,你就可以不用擔(dān)憂。輪=e2,句= 也二4,初=口41= 也3,4 fa = true/注意,他不會比擬類型。=。二2
14、3用= 2,3,4, fb = fake2/= false,也2,3,來源:下面代碼怎么沒有分成兩行顯示?echo This should be the first li八?在PHP中,一段代碼的結(jié)束標(biāo)記要么是?要么是?n(n表示換行)。因 此在上面的例子中,輸出的句子將顯示在同一行中,因為PHP忽略了代碼結(jié)束 標(biāo)記后面的換行。這意味著如果要輸出一個換行符,需要在每段PHP代碼的結(jié) 束標(biāo)記后面多加一個換行。PHP為什么這么做呢?因為在格式化正常的HTML時,這樣通常會更容易。假 如輸出了換行而你不需要這個換行時,就不得不用一個非常長的行來到達這樣的 效果,或者讓產(chǎn)生的HTML頁面的源文件的格式
15、很難讀。來源:字符串連接操作符的優(yōu)先級問題如果你運行下面的代碼,他將會輸出一個警告和結(jié)果3,因為字符串連接操作符.和 數(shù)學(xué)運算符+、-的優(yōu)先級時一樣的,它們將從左往右執(zhí)行。RcsHt:會被強轉(zhuǎn)成數(shù)組。如果你在低版本的PHP中運行,會告訴你中邊不是一個數(shù)字,如果你在7.4中運行,會告訴你,在PHP8中+、-的優(yōu)先級將會被提高。如 果你使用了 PHPSTORM中的EA插件,將會提醒你這個問題。匕= 3;ccko Result: 11 , $var + 3;如果你不希望這樣,那么最好使用括號把它包裹起來,就像下面那樣。= 3;echo Result: . ($var + 3);4,1= $匕= tr
16、ue/如果你要比擬類型,你應(yīng)該使用二二二 = fake無序的比擬:下面的列表中,使用=將會返回true ,因為他們的值是相等的,只是順序不 同,但是如果使用=將會返回類型,因為=的時候會考慮鍵值順序和數(shù)據(jù) 類型。 fa =三= 八“儂。 = Jack,sex = 1,age = 18,J fb =6= = Jack,ageu = 18sex 二 也 fa = fb= true= $b= false來源:PHP:數(shù)組運算符- Manual合并數(shù)組數(shù)組還可以相加什),用來合并數(shù)組,使用array_merge可以合并數(shù)組可以把兩 個數(shù)組相加,想必是都知道的,但是其實+號向可以,雖然都是合并數(shù)組,這兩
17、個方法各有區(qū)別。+更像是替換。1、使用array_merge合并非關(guān)聯(lián)數(shù)組時,不會過濾重復(fù)工程,+會(更像是替 換)如=口2引= I也2,3, 卅=2,二4= I2,3,生= 也2,3,2,3,4,1 $a + 輪= 2,二2、使用array_merge合并關(guān)聯(lián)數(shù)組時,如果鍵重復(fù),將會保存最后一個數(shù)組的 值,而使用+將會保存第一個鍵下面的值。= 八an/ie = Jack,sex = 1,age = 18, fb = ,iakve,=,Jack,/age,=,18,J,sex,=tl,;= I八qhac = Jack,age = 18,scx = 工、弛)= I八3e = Jack,scx =
18、 i,鄧 = 18、1 $a + fb= 八3e = Jack,scx = 1,憶 ge = 18?3、當(dāng)關(guān)聯(lián)數(shù)組中存在數(shù)字鍵時,array_merge會重置數(shù)字鍵,+那么不會 fa =以M。三JqckJsex二叱的0二18;= 八mc = Jackjscx = 1,4ge 二 $b =Jack1 Jlage,=,18,J,sex,=,l,J,lO,=,lai1;= 八3e = Jack,age =sex= ”,1 M array_ierge($ab)= I八xe = Jackscx = 叱age“ = 28,/O =,次巴+ 輪= I八an/e = Jack,scx = uageu = 18
19、,/IO =下面用一張圖來概括一下。array merge($af $b)array replace($a, $b)$a + $b123234 2, 3,41,2, 3$b=2.3, 4$a = one = aV,two =a2, three1 = a3$b=two =b2, three* = b3, Tour = b4two =“three =7ourn =one“two” =Hb2 three” =“b3”, wfourw =“b4”,one = HaRtwon =Ha three-four = Mt 0 12aII圖片來源:array_merge vs array_replace vs
20、+ (plus aka union) in PHP | SOFTonSOFA注意你的for each注意你的for中的表達式for是基本方式之一,雖然在php中,foreach比for方便的多,但是還是要提 一下。?phpfarr = array_pad(, OOOOOO,八d();$ start = -kicrot 沁 c(2);for (fi = O $i co八咐); $i+) /什么也不做)vaj41AMp(spHntfC%,6匕 fstart + 二 microtime(l);/$ start =-刈0土沁0(1);for (軻=Oj *leh=co八軻 fleia;圻+) /什么也
21、不做)MaK_dMp(spnVvtfC%.5f,$ start 十 二 小匕。力0(2);上面這段代碼,上面局部的運行時間是下面運行時間的3倍,甚至更多,因為 PHP不夠聰明。當(dāng)你在for第二個表達式里面使用函數(shù),for會在每次都去調(diào)用這個函數(shù),進而 造成額外消耗。而第二局部的,那么是在第一局部表達式中,使用了一個臨時變量(如果你的數(shù)組 不會變化,那么最好使用第二種。)。注意foreach造成的變量外泄,尤其是在引用時。在php中,使用foreach分配的變量,在foreach結(jié)束后依然可以訪問到,而 且更加致命的是,如果你使用了引用,那么當(dāng)你在后面修改,辿小時,將會直接 影響到原數(shù)組。要防止
22、此類情況發(fā)生,你可以在每次foreach的結(jié)尾使用以八s況由死咽來處理, 也可以在foreach結(jié)束后在外面八s由笈叫。*Mt(2)*2卜*Mt(3)3=,八 t(4)4=Mt(5)*)*/foreach (qnrr s* 2;va r_diArr) ;/*-gO= TOC o 1-5 h z Mt(2)田二Mt(4)2=at(6)3=vt(8)4=& 知C。)FVva nd”ftem);/* 認(rèn)t(1O)*/-八化va r_diA mp(于 rr) ;/*array(S) o=Mt(2)來源: s:/ /manual/zh/language.operators.string.php#4195
23、0字符串連接操作符與數(shù)字運行下面代碼,尤其是第三行,請注意,如果.左右存在空格,那么即使是一個 數(shù)字,也將會作用成字符串連接。eck。協(xié)/prints the string tl 八= 1);/ test2,ech。kttpj?3以/。叼伽; s:/ /manual/zh/function. -build-query.php#60523True和False將會被轉(zhuǎn)換成數(shù)字= testel= true,tested=false;/ teste工二工&teste2=Oecko _bni(d_q(AeYg($a) 來源: s:/ /manual/zh/function. -build-query.p
24、hp#122232空的數(shù)組不會出現(xiàn)在結(jié)果中證 t(4)2.=知:刃工iktfS)4=&NULL 23);/ iaaie=iiller&age=2.3echo _bc(i(d_qL(crg3Post_data);來源: s:/ /manual/zh/function. -build-query.php#109466簡述OpCache的原理PHP執(zhí)行這段代碼會經(jīng)過如下4個步驟(確切的來說,應(yīng)該是PHP的語言引擎 Zend)1. Scanning(Lexing),將 PHP 代碼轉(zhuǎn)換為語言片段(Tokens)2. Parsing,將Tokens轉(zhuǎn)換成簡單而有意義的表達式3. Compilation,
25、將表達式編譯成 Opocdes4. Execution,順次執(zhí)行Opcodes,每次一條,從而實現(xiàn)PHP腳本的功能?,F(xiàn)在有的Cache比方APC,可以使得PHP緩存住Opcodes,這樣,每次有請求來臨 的時候,就不需要重復(fù)執(zhí)行前面3步,從而能大幅的提高PHP的執(zhí)行速度。來源:var_dump (1. 9)輸出什么??php輸出10.9,乍一看這個vajdump的輸出很奇怪是不是?為什么呢?這里教大家,如果看到一段PHP代碼感覺輸出很奇怪,第一反響是看下這段代 碼生成的opcodes是啥,雖然這個問題其實是詞法分析階段的問題,不過還是用 phpdbg分析下吧(一般為了防止opcache的影響,
26、會傳遞-n):phpdbg 一八 一p /tMp/l.phpfunction 八(八作山認(rèn)。/tp/工.php -Ox7f5&4工+ 4 opsL2 #O INIT_FCALL 96 uvar_diAip,L2 #1 SENP_VAL 工。.”1L2 #2 POJALLLSS #3 RETURNT 1所以這么看來,早在生成。pcode之前,1.9就變成了常量10.9,考慮到這是字 面量,我們現(xiàn)在去看看zend_language_scanner.l,找到這么一行:DNUM (LNUM?,LNUM)|(LNUM.LNUM?)這個是詞法分析定義的浮點數(shù)的格式,到這里也就恍然大悟了:9會被依次接受為:
27、1.(浮點數(shù)。然后是.(字符串連接符號)然后是.9(浮點 數(shù)。9)所以在編譯階段就會直接生成字符串的字面量 10.9來源: 0XY 漏洞這里有一個核心的背景是,長久一來我們習(xí)慣了使用一個名為“ _proxy”的環(huán) 境變量來設(shè)置我們的請求代理。wget kttF:/wwware八.cox/如何形成?在CGI(RFC3875)的模式的時候,會把請求中的Header,加上 _前綴,注 冊為環(huán)境變量,所以如果你在Header中發(fā)送一個Proxy:xxxxxx,那么PHP就會 把他注冊為 _PROXY環(huán)境變量,于是getem/d PROXY)就變成可被控 制的了.那么如虹你的所有類似的請求,都會被代理到
28、攻擊者想要的地址,之 后攻擊者就可以偽造,監(jiān)聽,篡改你的請求了如何影響?所以,這個漏洞要影響你,有幾個核心前提是:你的服務(wù)會對外請求資源你的服務(wù)使用了 _PROXY(大寫的)環(huán)境變量來代理你的請求(可能是你自己寫, 或是使用一些有缺陷的類庫)你的服務(wù)跑在PHP的CGI模式下(cgi, php-fpm)如何處理?以Nginx為例,在配置中加入: _PROXY ;所以建議,即使你不受此次漏洞影響,也應(yīng)該加入這個配置.而如果你是一個類庫的作者,或者你因為什么原因沒有方法修改服務(wù)配置,那么你就需要在代碼中加入對sapi的判斷,除非是cli模式,否那么永遠(yuǎn)不要相信 _proxy環(huán)境變量,?phpif 吸
29、八= cli1 & gctc八C _PROXY。)/只有CU模式下, H7TP_PROX丫環(huán)境變量才是可控的)補充:從開始,getenv增加了第二個參數(shù),local_only二false,如果這個 參數(shù)為true,那么只會從系統(tǒng)本地的環(huán)境變量表中獲取,從而修復(fù)這個問題,并且 默認(rèn)的PHP將攔截 _PROXY:fix OXY漏洞說明-風(fēng)雪之隅運算符優(yōu)先級&和and在賦值運算中的問題運行下面的代碼,第一個勃將打印為fake,預(yù)期如此,但是第二個秘將打 印true。這是因為=的優(yōu)先級高于and運算符,所以,第二個加/將會被當(dāng)成(輪oo( = triAe) avd fake 執(zhí)行。?phpfbool = true & fake;/ fakevajdbap(輪00();$bool = true av(k false;/來源: s:/ /manual/zh/language.operators.precedence.php#117390instanceof 運算符你是否曾經(jīng)寫過下面這樣的代碼?php$A =八cw AQ; / Lvar_d(Aip(!于A iistaiaceof A); /
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村耕地抵押合同范例
- 體育合作合同范例
- 2024-2025學(xué)年河南省駐馬店市新蔡縣高一上冊10月月考數(shù)學(xué)檢測試卷
- 買賣終止合同范本
- 倉儲長期保管合同范例
- 冷庫燈具采購合同范例
- 不固定單價合同范例
- 養(yǎng)殖銷售合同范例
- 第六章 第3節(jié) 測量液體和固體的密度2024-2025學(xué)年新教材八年級上冊物理新教學(xué)設(shè)計(人教版2024)
- 加工雪地靴合同范本
- 廣東省佛山市2024年中考英語模擬試卷(含答案)
- ISO14644國際標(biāo)準(zhǔn)(中文版)
- DB22T 1189.2-2011 無公害農(nóng)產(chǎn)品 天麻 第2部分:種子與種麻生產(chǎn)技術(shù)規(guī)程
- DL-T5024-2020電力工程地基處理技術(shù)規(guī)程
- 2024社工(初)《社會工作實務(wù)》考試題庫附答案
- 2024年蘭州市高三診斷考試(一診)數(shù)學(xué)試卷(含答案)
- 辦公耗材采購服務(wù)方案(技術(shù)方案)
- (高清版)JTGT 5532-2023 公路橋梁支座和伸縮裝置養(yǎng)護與更換技術(shù)規(guī)范
- 廣東省廣州市越秀區(qū)2022-2023學(xué)年六年級下學(xué)期期末數(shù)學(xué)試卷
- 《成功之路+進步篇+1》第1課課件
- (2024年)特種設(shè)備安全法律法規(guī)培訓(xùn)課件
評論
0/150
提交評論