1、框架底层原理 1.1、类库的自动加载 ``` Php的标准类库 spl_autoload_register composer的加载(PSR-4) 自定义任何目录的加载: psr-4规则里定义目录以后(composer dumpautoload) ``` 1.2、基本功能的加载(facade) ``` 门面模式 ``` 1.3、服务的加载(ioc容器) ``` 请大家阅读laravel的源代码,服务的注册、监听、通信是基于什么设计模式实现。 ``` 2、PHP相关知识 2.1、网络协议 ``` OSI七层模型 第一层:物理层 第二层:数据链路层 第三层:网络层 第四层:传输层 定义传输数据的协议端口号以及流控和差错校验 协议:TCP/UDP,数据包一旦离开网卡即将进入网络传输层 第五层:会话层层 第六层:表示层 第七层:应用层:网络服务与最终用户的一个接口 ``` 协议: ``` HTTP:80 HTTPS:443 FTP(21)-文件传输 SMTP(25) 邮件发送 SNMP DNS (53)域名解析 TELNET(23) 远程登录 POPS(110) 邮件接收 DHCP ``` HTTP协议的特点: ``` 无状态 基于B/S模式 通信开销小、简单快速、传输成本低 使用灵活、可使用超文本传输协议 节约传输时间 ``` HTTP协议状态码: ``` 标记返回请求结果,知道服务器是否可用正常处理请求 1XX 信息类 2XX 200正常返回数据 204已成功处理,不含实体 206部分内容 3XX 301永久重定向 302临时重定向 303定向获取 304附加条件的请求 307临时重定向 4XX 客户端错误 400存在语法错误 401 需要通过HTTP认证403 服务器拒绝404 服务器无法请求 5XX 服务器错误 500 执行请求发送错误 503 超负载运行,无法响应 ``` GET/POST的请求区别 ``` GET 安全差 POST GET 2048 url地址的最大长度 POST 没有限制 GET ascII POST 二进制数据等 GET 请求内容-application-x-www-form-urlencoded POST multipart-formdata GET 不会重新提交 POST 刷新浏览器数据被重新提交 GET 浏览器缓存 POST 不能缓存 GET 参数会自动 POST 不会保存(写隐藏表单) GET 收藏书签 POST 不能收藏 ``` 常见请求/响应头/请求方法 ``` content-type:请求实体的mime类型信息 Accept:客户端接收内容的类型 Cookie:发送给服务端的cookie值 Cache-control:指定请求和响应的缓存机制 User-agent:用户信息 Referrer:上级请求的路径 X-Forward-For:请求端的真实IP Access-Control-Allow-origin 允许特定的域名使用(跨域请求) Last-modified:请求资源的最后响应时间 ``` HTTP的工作原理: ``` 客户端发送请求给服务器,创建一个TCP连接,指定端口号,连接到服务器,服务器监听到浏览器请求,分析请求类型后,服务器根据客户端的请求类型返回状态信息和数据内容。 ``` HTTP协议的工作原理: ``` GET、-读取数据 POST、提交数据请求服务器进行处理 HEAD、指定资源的请求(只返回头信息) OPTIONS、查看服务器性能(功能是否正常) PUT、上传最新内容(修改) DELETE、删除指定的资源 TRACE、测试用,请求服务器回显收到的信息 ``` HTTPS协议的工作原理: ``` HTTPS是一种基于SSL/TLS的HTTP协议,所有的HTTP数据都是在SSL/TLS协议封装之上传输的 在HTTP协议的基础上添加了SSL/TLS的握手以及数据的加密传输 ``` 2.2 PHP基础知识 ``` 2.2.1、PHP引用变量 概念:用不同的名字访问同一个内容 定义方式:使用&符号 Unset() 断开变量的引用,不会销售内存空间 Object 引用类型的变量对象 堆栈中的内存分析: ``` 测试:memory_get_usage() 已经使用的内存 2.2.2、数据类型 ``` 字符串:单引号、双引号、heredoc和newdoc(处理长文本) 双引号:可以解析变量,可以使用特殊符号{}包含,可以解析转义字符 单引号效率更高 Heredoc 中间的变量可以解析 $str = <<<Eot Eot Newdoc 中间的变量不能解析 $str = <<<’Eot’ ‘Eot’ ``` 布尔类型flase的七种情况 ``` 0 0.0 ‘’ ‘0’ false array() null 浮点类型:不能用于算术运算(转二进制会有损耗) 数组类型: 超全局数组 $GLOBALS $_GET $_POST $_REQUEST $_COOKIE $_SERVER $_FILES $_ENV $_SERVER[‘QUERY_STRING’] ?后面的参数 $_SERVER[‘PATH_INFO’] 路径部分 $_SERVER[‘SERVER_ADDR] 服务器地址 $_SERVER[‘REMOT_ADDR] 客户端IP $_SERVER[‘REFFERER] 上一次请求 $_SERVER[‘SERVER_NAME’] $_SERVER[‘REQUEST_TIME’] $_SERVER[‘HTTP_USER_AGENT’] ``` 2.2.3预定义常量 ``` __FILE__ __LINE__ __DIR__ __FUNCTION__ __CLASS__ __TRAIT__ __METHOD__ __NAMESPACE__ Const 语言结构、定义类常量、速度快 define 函数、不能定义类常量 ``` 出现NULL的三种情况 ``` 直接申明、未定义的变量、UNSET销毁的变量 ``` 2.2.4运算符优先级 ``` 递增、递减 > ! > 数学运算符 > 比较运算符(大小比较) > 相等比较 > 逻辑运算符 > 三目运算 > 赋值运算 短路原则:如果该表达式的结果在第一个子表达式就已经能够决定结果,后面的子表达式不会再执行 ==和===的区别 前置递增和后置递增的区别? 先运算后返回,先返回后运算 Null的递增和递减 Null 递减 没有效果 Null 递增 结果为1 ``` 2.2.5 流程控制 ``` 遍历数组的三种方式: 数组遍历一:for while 只能遍历索引数组 数组遍历二:foreach 遍历索引数组和关联数组 每次都会执行reset(数组指针的重置) 数组遍历三: while list each 组合循环 遍历索引数组和关联数组 不会执行reset()操作 If语句和switch...case语句的区别 If...elseif 只会有一个语句块被执行,最多条件情况出现的条件放在前面 Switch...case switch后面的控制表达式只能是整型、浮点型、字符串 生成索引表,直接跳转到相对应的case For() { Switch( $condition ) { Case ...; Continue; //continue 1 continue 2跳出for循环 Break; //跳出switch语句 } } ```