版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、前百在一次偶然查看PHP文档的时候,发现了一些有趣的内容,随着阅读的增加, 越觉察得有趣的内容或者说时坑越来越多,所以我决定记录下来,提供出去,下 文中一些内容摘录自一些优秀的博客、PHP文档的用户笔记,或者文档原文。尤其是文档原文,我发现很多人不会去读,很多东西也不会去注意(是的,我也 是这样,所以借着这次机会,一起来学习一下。)我忘了 PHP函数的参数顺序,它们是随机的吗?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.译:数组相关方法的参数顺序为,needle, haystack,字符串相关方法那么是相 反的haystack, needlej ,来源:我应该如何保存“盐” ?当使用password_hash()或者crypt()函数时,盐会被作为生成的散列值的一 局部返回。你可以直接把完整的返回值存储到数据库
3、中,因为这个返回值中已 经包含了足够的信息,可以直接用在password_verify()或crypt()函数来进行 密码验证。下列图展示了 crypt()或password_hash()函数返回值的结构。如你所见,算法 的信息以及盐都已经包含在返面值中,在后续的密码验证中将会用到这些信,息、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函数参考:参考: s:/ /manual/zh/function.unset.php#example-5601isset和unset同时支持多个参数unset支持多个参数,想必大多数人是知道的,但是isset也支持哟。?phpva r_diA isseta,也 $c);tms况(弧场于c);你不需要担忧这几个变量没有被设置,他们在这里都是平安的,不会报错,在 isset多个变量时,必须要所有变量都不为八M时,才会返回true,当遇到一个不 存在时,将会立即返回。参考
5、:快速查询一个函数或者类或语法的参考当你要查询一个php方法或者对象或者语法时,你不需要翻开php手册进行 搜索,你只需要在kttps:/p.八后面跟上方法、语法、对象的名字即 可,并且不需要关心大小i额,比方像下面这些链接。 s:/curlfile s:/isset s:/if使用反射调用protected或者private的类方法如果想防止一个方法被外部可见或者子类可见,可以采用protected或者 private关键字来修改这些类,但是我们有时候又想在外部调用这些方法,应该 怎么办呢?只能改成public吗?如果这是我们自己的代码,当然可以这样做, 但是如果是引入的外部代码的话,可能就
6、不太好直接修改了。现在,我们可以在外部使用反射来调用这些方法,现在我们来定义一个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;通常情况下,我们是没有方法直接调用age和weight方法的,现在,我们使 用反射来调用。geMetkod(Zg/); / 获取 age 方法$”geMekod-seAccessib/e(tKe); /设置可见性/
7、调用这个方法,需要传入对象作为上下文芋nge =串ageMethod-ioke(reflectionClass -new次st4八ccO)4QdHA?(于ge);/ 22 上面的代码看起来有些繁琐,还有一个更简单的方法。?php/ .*ef(ccti。八Class = mw Rcf/ccti。八assCLk4);$wcigktM况kod =新eflcctio八ClaOgetMetkoclCwcight;/获取 weight方法 获取一个闭包,然后调用,同样需要传入对象作为上下文,后面调用的地方就可以传入参数于weight =$weiglgetClou(re($reflectioiC(ass-i
8、newltaiceQWvar_diAKvp($weightY 调用静态方法?php/ 轲eflecti。八Class = new Reflecti。八C(ass(Lisa、轮atMethod gctMctkodCct);$catMctkod-sctAcccssib/c(trc);$cat =$eatMethod-iyvoke(iull / 如果是一个静态方法,你可以传递一个 八同样,类成员也可以使用反射进行修改。参考:实例化一个类,但是绕过他的构造方法有没有这样想过?实例化一个类,但是却不想调用他的构造方法(construct), 这里也可以用反射做到。n4MC =$h ai4/c;)publ
9、ic fixACti。八 get Name。return 于丽s-八)*dogClass = new Ref lectio八Class(Dog);/创立一个新实例,但是不调用构造方法$4。shmcc二,dogC/ass-八ew伉s4八ccWithoutCo八stKuctorOw41cd3?($dog伉sta八ce-getNhcO); / 八 如果你的环境不能使用反射,你还可以试试另一个很cool的方法,就是使用反 序列化,可以参考包 doctrine/instantiator - Packagist参考: or.php获取类一个类的所有父类使用脑核步瓯以区可以获取一个类的所有父类,并且支持自动
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递增时字母都将向后增加一个,但是当z的时候,就将会回到aa ,循环如 此,但是只能递增,不能递减 A廿= A2= A3= OA +$4= OB= uoorcu= A。= AOO2 +$4= AOO2 +$= AOOy但是请注意一些意外情况,比方这样。 M= 3EO +*“= 0.0这是因为9E0被当作成了浮点数的字符串表示,被PHP当成了 9*10A0 ,被评 估成了 9 ,然后在执行的递增。参考来源:.请注意你的嵌套强制类型转换,否那么他会发生意外var_d(Aip(TRUE = (boolean) (airray) (Mt) FALSE);/ truevar_diAvp(array f
12、/kt) FALSE);因为当把FALSE转为数字是,他是0,再转为数组后,就成了,QJ,所以再转为boolean时,将会返回true,因为数组不为空,并且回仁口 参考: s:/ /manual/zh/language.types.type-juggling.php#115373高版本中的数字与字符串进行比拟自PHP 8.0开始。数字与非数字形式的字符串之间的非严格比拟现在将首先将数字 转为字符串,然后比拟这两个字符串。数字与数字形式的字符串 之间的比拟仍然像之前那样进行。请注意,这意味着0 = z/not-a-numberz/ 现在将被认为是 false。ComparisonBeforeAf
13、ter0 = 0truetrue0 = 0. 0truetrue0 = footruefalse0 = truefalse42 = 42truetrue42 = 42footruefalse琴节: s:/ /manual/zh/migration80.incompatible.php#migration80.incom patible.core数组也可以直接比拟你可以直接使用二二比拟两个数组有相同的键值对,如果这不是一个关联数组, 那么就要保证值的顺序相对应,如果时一个关联数组,你就可以不用担忧。轮=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中,一段代码的结束标记要么是?要么是?n(n表示换行)。因 此在上面的例子中,输出的句子将显示在同一行中,因为PHP忽略了代码结束 标记后面的换行。这意味着如果要输出一个换行符,需要在每段PHP代码的结 束标记后面多加一个换行。PHP为什么这么做呢?因为在格式化正常的HTML时,这样通常会更容易。假 如输出了换行而你不需要这个换行时,就不得不用一个非常长的行来到达这样的 效果,或者让产生的HTML页面的源文件的格式
15、很难读。来源:字符串连接操作符的优先级问题如果你运行下面的代码,他将会输出一个警告和结果3,因为字符串连接操作符.和 数学运算符+、-的优先级时一样的,它们将从左往右执行。RcsHt:会被强转成数组。如果你在低版本的PHP中运行,会告诉你中边不是一个数字,如果你在7.4中运行,会告诉你,在PHP8中+、-的优先级将会被提高。如 果你使用了 PHPSTORM中的EA插件,将会提醒你这个问题。匕= 3;ccko Result: 11 , $var + 3;如果你不希望这样,那么最好使用括号把它包裹起来,就像下面那样。= 3;echo Result: . ($var + 3);4,1= $匕= tr
16、ue/如果你要比拟类型,你应该使用二二二 = fake无序的比拟:下面的列表中,使用=将会返回true ,因为他们的值是相等的,只是顺序不 同,但是如果使用=将会返回类型,因为=的时候会考虑键值顺序和数据 类型。 fa =三= 八“侬。 = Jack,sex = 1,age = 18,J fb =6= = Jack,ageu = 18sex 二 也 fa = fb= true= $b= false来源:PHP:数组运算符- Manual合并数组数组还可以相加什),用来合并数组,使用array_merge可以合并数组可以把两 个数组相加,想必是都知道的,但是其实+号向可以,虽然都是合并数组,这两
17、个方法各有区别。+更像是替换。1、使用array_merge合并非关联数组时,不会过滤重复工程,+会(更像是替 换)如=口2引= I也2,3, 卅=2,二4= I2,3,生= 也2,3,2,3,4,1 $a + 轮= 2,二2、使用array_merge合并关联数组时,如果键重复,将会保存最后一个数组的 值,而使用+将会保存第一个键下面的值。= 八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、当关联数组中存在数字键时,array_merge会重置数字键,+那么不会 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不够聪明。当你在for第二个表达式里面使用函数,for会在每次都去调用这个函数,进而 造成额外消耗。而第二局部的,那么是在第一局部表达式中,使用了一个临时变量(如果你的数组 不会变化,那么最好使用第二种。)。注意foreach造成的变量外泄,尤其是在引用时。在php中,使用foreach分配的变量,在foreach结束后依然可以访问到,而 且更加致命的是,如果你使用了引用,那么当你在后面修改,辿小时,将会直接 影响到原数组。要防止
22、此类情况发生,你可以在每次foreach的结尾使用以八s况由死咽来处理, 也可以在foreach结束后在外面八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);/* 认t(1O)*/-八化va r_diA mp(于 rr) ;/*array(S) o=Mt(2)来源: s:/ /manual/zh/language.operators.string.php#4195
23、0字符串连接操作符与数字运行下面代码,尤其是第三行,请注意,如果.左右存在空格,那么即使是一个 数字,也将会作用成字符串连接。eck。协/prints the string tl 八= 1);/ test2,ech。kttpj?3以/。叼伽; s:/ /manual/zh/function. -build-query.php#60523True和False将会被转换成数字= testel= true,tested=false;/ teste工二工&teste2=Oecko _bni(d_q(AeYg($a) 来源: s:/ /manual/zh/function. -build-query.p
24、hp#122232空的数组不会出现在结果中证 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执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎 Zend)1. Scanning(Lexing),将 PHP 代码转换为语言片段(Tokens)2. Parsing,将Tokens转换成简单而有意义的表达式3. Compilation,
25、将表达式编译成 Opocdes4. Execution,顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。现在有的Cache比方APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临 的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。来源:var_dump (1. 9)输出什么??php输出10.9,乍一看这个vajdump的输出很奇怪是不是?为什么呢?这里教大家,如果看到一段PHP代码感觉输出很奇怪,第一反响是看下这段代 码生成的opcodes是啥,虽然这个问题其实是词法分析阶段的问题,不过还是用 phpdbg分析下吧(一般为了防止opcache的影响,
26、会传递-n):phpdbg 一八 一p /tMp/l.phpfunction 八(八作山认。/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,考虑到这是字 面量,我们现在去看看zend_language_scanner.l,找到这么一行:DNUM (LNUM?,LNUM)|(LNUM.LNUM?)这个是词法分析定义的浮点数的格式,到这里也就恍然大悟了:9会被依次接受为:
27、1.(浮点数。然后是.(字符串连接符号)然后是.9(浮点 数。9)所以在编译阶段就会直接生成字符串的字面量 10.9来源: 0XY 漏洞这里有一个核心的背景是,长久一来我们习惯了使用一个名为“ _proxy”的环 境变量来设置我们的请求代理。wget kttF:/wwware八.cox/如何形成?在CGI(RFC3875)的模式的时候,会把请求中的Header,加上 _前缀,注 册为环境变量,所以如果你在Header中发送一个Proxy:xxxxxx,那么PHP就会 把他注册为 _PROXY环境变量,于是getem/d PROXY)就变成可被控 制的了.那么如虹你的所有类似的请求,都会被代理到
28、攻击者想要的地址,之 后攻击者就可以伪造,监听,篡改你的请求了如何影响?所以,这个漏洞要影响你,有几个核心前提是:你的服务会对外请求资源你的服务使用了 _PROXY(大写的)环境变量来代理你的请求(可能是你自己写, 或是使用一些有缺陷的类库)你的服务跑在PHP的CGI模式下(cgi, php-fpm)如何处理?以Nginx为例,在配置中加入: _PROXY ;所以建议,即使你不受此次漏洞影响,也应该加入这个配置.而如果你是一个类库的作者,或者你因为什么原因没有方法修改服务配置,那么你就需要在代码中加入对sapi的判断,除非是cli模式,否那么永远不要相信 _proxy环境变量,?phpif 吸
29、八= cli1 & gctc八C _PROXY。)/只有CU模式下, H7TP_PROX丫环境变量才是可控的)补充:从开始,getenv增加了第二个参数,local_only二false,如果这个 参数为true,那么只会从系统本地的环境变量表中获取,从而修复这个问题,并且 默认的PHP将拦截 _PROXY:fix OXY漏洞说明-风雪之隅运算符优先级&和and在赋值运算中的问题运行下面的代码,第一个勃将打印为fake,预期如此,但是第二个秘将打 印true。这是因为=的优先级高于and运算符,所以,第二个加/将会被当成(轮oo( = triAe) avd fake 执行。?phpfbool = true & fake;/ fakevajdbap(轮00();$bool = true av(k false;/来源: s:/ /manual/zh/language.operators.precedence.php#117390instanceof 运算符你是否曾经写过下面这样的代码?php$A =八cw AQ; / Lvar_d(Aip(!于A iistaiaceof A); /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新GCP医疗器械临床试验知识试题(附含答案)
- 八年级道德与法治上册《法不可违》单元整体教学设计及课时教案
- 公路边坡塌方处治专项方案
- 混凝土摊铺机操作规程保证措施
- 弱电工程师考试试题及答案
- 2026年监理工程师之土木建筑目标控制通关考试题库带答案解析
- 悬空高处作业专项隐患排查保证措施
- 结核病防治知识培训试题带答案
- 古建筑槛窗安装施工工艺
- 管道设备保冷施工方案
- 2026年加油站散装汽油销售管理培训
- 2025年山东省济南市八年级地理生物会考真题试卷(含答案)
- 2026年广东省惠州市初二学业水平地理生物会考试题题库(答案+解析)
- 2026年高考(安徽卷)物理试题及答案
- 2026年新版啤酒酿酒师考试试题及答案
- 公路斜拉桥监理实施细则
- (可编辑!)新版《检验检测机构资质认定评审准则》(2023版)内部审核检查表示例
- 2026年度招生与毕业就业分析与指导
- 深水井施工组织设计方案
- 五年级数学下册第三单元《长方体和正方体》单元素养作业
- 煤矿安全生产 标准化管理体系
评论
0/150
提交评论