1. 引用变量
<?php $a = range(0, 1000); var_dump(memory_get_usage()); // COW: Copy On Write 有修改操作才会进行copy // $b = $a; $b = &$a; var_dump(memory_get_usage()); $a = range(0, 1000); var_dump(memory_get_usage()); // zval变量容器 $c = range(0, 3); // 需安装xdebug扩展 xdebug_debug_zval('c'); $d = $c; xdebug_debug_zval('c'); $c = range(0, 3); xdebug_debug_zval('c'); // unset 只会取消引用,不会销毁空间 // 对象本身就是引用传递 class Person { public $name = "zhangsan"; } $p1 = new Person; xdebug_debug_zval('p1'); $p2 = $p1; xdebug_debug_zval('p1'); $p2->name = "lisi"; xdebug_debug_zval('p1');
概念:用不同的名字访问同一个变量内容
定义方式:&
工作原理:
2. 常量及数据类型
字符串的定义方式:单引号,双引号,heredoc和newdoc 区别:单引号不能解析变量,不能解析转义字符,只能解析单引号和反斜线本身,效率比双引号高;双引号可以解析变量,变量可以使用特殊字符和{}包含,可以解析所有转义字符;heredoc和newdoc分别类似于双和单引号,都用来处理大文本
数据类型:标量,复合,特殊
1. 浮点类型不能运用到比较运算中;
2. boolean的false的七种情况;
3. 超全局数组:$GLOBALS,$_GET,$_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILES,$_ENV
4. NULL的三种情况:直接赋值,未定义的变量,unset销毁的变量
常量:const更快,是语言结构,可以定义类常量;define是函数,不能用于类常量的定义;常量一经定义,不能被修改和删除 预定义常量:__FILE__,LINE DIR FUNCTION CLASS TRAIT METHOD NAMESPACE
3. 运算符
错误控制符@:放置在一个表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
运算符优先级:++/-- > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用>^>|>逻辑与>逻辑或>三目>赋值>and > xor > or
比较运算符:==和===的区别;等值判断(false的7种情况都是等值)
++/--:不影响boolean值;--NULL没有效果,++NULL为1
逻辑运算符:短路作用;||和&&与or和and优先级不同
4. 流程控制
遍历数组的3种方式及各自的区别:for循环只能遍历索引数组;foreach可以遍历索引和关联数组,会reset();联合使用list(),each()和while循环同样可以遍历索引和关联数组,不会reset()操作(将数组指针回到开头)。
分支:使用elseif时,总把优先范围小的条件放在前面处理;switch后面的控制表达式的数据类型只能是整形,浮点或字符串;continue作用到switch的作用类似于break;跳出switch外的循环可以使用continue 2;switch...case...会生成跳转表,直接跳转到对应case
5. 自定义函数和内部函数
变量作用域:它定义的上下文背景(也是它的生效范围),大部分变量只有一个单独的范围,跨度同样包含了include和require引入的文件;global关键字的作用;$GLOBALS及其他超全局数组;
静态变量:仅在局部函数域中存在,程序执行离开此作用域时其值不会消失;static:仅初始化一次,初始化时需要赋值,每次执行函数该值会保留,修饰的变量是局部的,仅在函数内部有效,可以记录函数的调用次数,从而在某些条件下终止递归,初始static变量未赋值时值为NULL
函数的参数:默认情况下通过值传递;如果希望允许函数修改它的值,必须通过引用传递参数
函数的返回值:可返回包括数组和对象的任意类型;省略return,返回值为NULL,不可有多个返回值;从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用&
外部文件的导入:include/require包含并运行指定文件;如果给出路径名按照路径查找,否则从include_path中查找,再没有则从调用脚本文件所在的目录和当前工作目录下寻找;当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围;加载过程中未找到文件则include会发出一条警告,后者会发出一个致命错误;include(require)/include_once(require_once)唯一区别是会检查该文件是否已经被包含过,如果是则不会再次包含
系统内置函数:
时间日期:date() strtotime() mktime() time() microtime()
IP处理:ip2long() long2ip()
打印处理:print() printf() print_r() echo sprintf() var_dump() var_export()
序列化及反序列化函数:serialize() unserialize()
字符串处理:implode() explode() join() strrev() trim() strstr() number_format()
数组处理:array_keys() values() diff() intersect() merge() shift() unshift() pop() push() sort() rand()
6. 正则表达式
作用:分割,查找,匹配,替换字符串
分隔符:/,#,~
通用原子:\d \D \w \W \s \S
元字符:. * ^ $ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符:i m e s U x A D u
后向引用:'/<b>(.*)<\/b>/' preg_replace($pattern, '\\1', $str)
贪婪模式:'/<b>.*?<\/b>/' 或者'/<b>.*<\/b>/U' preg_replace_all($pattern, '\\1', $str)
PCRE函数:preg_match() preg_match_all() preg_replace() preg_split()
中文匹配:UTF-8汉字编码范围是0x4e00-0x9fa5,在ANSI(gb2312)环境下0xb0-0xf7,0xa1-0xfe,utf-8要使用u模式修正符使模式字符串被当成utf-8,在ANSI(gb2312)环境下要使用chr将ascii码转换为字符
7. 文件及目录处理
文件读取/写入操作:fopen() 打开模式:r/r++,w/w++,a/a++,x/x++,b,t
写入函数:fwrite() fputs()
读取函数:fread() fgets() fgetc()
关闭文件函数:fclose()
不需要fopen()打开的函数:file_get_contents() file_put_contents()
其它读取函数:file() readfile()
访问远程文件:开启allow_url_fopen(),HTTP协议连接只能使用只读,FTP协议可以使用只读或者只写
目录操作函数:
名称相关:basename() dirname() pathinfo()
目录读取:opendir() readdir() closedir() rewinddir()
目录删除:rmdir()
目录创建:mkdir()
文件大小:filesize()
目录大小:disk_free_space() disk_total_space()
文件拷贝:copy()
删除文件:unlink()
文件类型:filetype()
重命名文件或者目录:rename()
文件截取:ftruncate()
文件属性:file_exists() is_readable() is_writeable() is_executable() filectime() fileatime() filemtime()
文件锁:flock()
文件指针:ftell() fseek() rewind()
8. 会话控制
通过GET参数传递,信息会暴露,参数可能丢失
cookie:有服务器发送给客户端的片段信息
操作:setcookie() $_COOKIE
优缺点:不占用服务器资源,效率高些;不建议保存敏感信息,用户有权禁用
session:基于cookie,利用cookie传递的sessionID信息在服务器中查找对应文件
操作:session_start() $_SESSION session_destory() session.auto_start .cookie_domain .cookie_lifetime .cookie_path .name .save_path .use_cookies .use_trans_sid .gc_probability .gc_devisor .gc_maxlifetime .save_handler
优缺点:信息安全,占用服务器资源
传递sessionID的问题:session_name() session_id() SID
session存储:session_set_save_handler() mysql,memcache,redis等
9. 面向对象
类权限控制修饰符:public protected private
封装:成员访问权限
继承:单一继承;方法重写 parent::
多态:抽象类的定义;接口的定义
魔术方法:__construct(),destruct,call,callStatic,get,set,isset,unset,sleep,wakeup,toString,clone
常见设计模式:工厂,单例,注册树,适配器,观察者,策略
10. 网络协议
HTTP协议状态码:五类响应 1XX:信息类,接收请求状态处理 2XX:成功,请求正常处理完毕 3XX:重定向,需要附加操作以完成请求 4XX:客户端错误,服务器无法处理请求 5XX:服务器错误状态码,服务器处理请求出错 常见状态码:200 204 206 301 302 303 304 307 400 401 403 404 500 503
OSI7层模型:物理: 建立,维护,断开物理连接 数据链路:建立逻辑链接,进行硬件地址寻址,差错校验等功能 网络:进行逻辑地址寻址,实现不同网络之间的路径选择 传输:定义传输数据的协议端口号,以及流控和差错校验 会话:建立管理终止会话 表示:数据表示安全压缩 应用:网络服务与最终用户的一个接口
HTTP协议的工作特点和工作原理:基于B/S模式,通信开销小,简单快速,传输成本低,使用灵活,可使用超文本传输协议,节省传输时间,无状态; 客户端发送请求给服务器,创建一个TCP连接,指定端口号,默认80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器会向客户端返回状态信息和数据内容
HTTP协议常见请求/响应头:Content-Type, Accept, Origin, Cookie, Cache-control, User-Agent, Referrer, X-Forwarder-For, Access-Control-Allow-Origin, Last-Modified
HTTP协议的请求方法:GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE
GET和POST的区别:GET在后退和刷新没有变化,无害;POST会重新提交。GET可以收藏为书签,POST不行。GET可以在浏览器缓存,POST不行。GET编码类型Appication- ,POST还有multipart- ,文件上传时需改为post。GET参数会保存在历史记录中,POST不会。GET向url添加数据长度受限,POST无限制。GET只允许ascii字符,POST无限制。GET安全性差。
HTTPS的工作原理:一种基于SSL/TLS的HTTP协议,所有的HTTP数据都是在SSL/TLS协议封装之上传输的。在HTTP协议基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。
常见网络协议含义及端口:FTP21Telnet23 SMTP25 POP3110 HTTP80 DNS53
11. 开发环境及配置
版本控制软件:集中式 CVS和SVN 和分布式Git 容灾性,不用连接网络?
PHP的运行原理:Nginx+PHP-FPM(FastCGI的进程管理器,master监听端口和worker处理PHP代码)
CGI:PHP解析器和webserver的连接 FastCGI:每次处理完请求后不会kill掉进程,使其一次处理多个请求,不用重新fork一个进程
PHP常见配置项:register_globals, allow_url_fopen, allow_url_include, date.timezone, display_errors, error_reporting, safe_mode, upload_max_filesize, max_file_uploads, post_max_size