文章目录
为什么起“又忘了”这个标题,今天在开团队周讨论会的时候,一些PHP基础知识原理又记不牢了,想到小学老师经常重复的一句话:好记性不如烂笔头,那就写吧!
一、Session原理
HTTP协议是无状态的,协议对于事务处理没有记忆能力,当关闭浏览器时,HTTP连接就断开了,如果访问同一个网站的另一个页面时,可能就会需要session来记录一些信息,也就是说session类似一个全局变量穿插在整个网站中。
第一次:当用户访问网站的一个页面时,session_start()函数为用户创建一个session ID,注意:这个session ID是用户的唯一标识,session ID会放入响应头的cookie中,发送给客户端,用户就拥有了这个网站给他的session ID。
第二次:当用户再次访问时,浏览器会带着存有session ID的cookie随着HTTP请求一起发送到服务端,服务器端接到请求后会检查有没有这个session ID对应的session文件,没有的话就创建一个新的,跟第一次访问一样。
退出时:session_destroy(),把该用户的session文件清除,再把用户的cookie清除,这样客户端和服务端就没有联系了。
# PHP关于Session的相关函数
session_start(): 启动session,这个没什么说的了。根据session ID打开session文件,如果没有session ID就创建一个ID和对应的session文件
$SESSION[]:存放用户信息的全局数组,session文件中除了存放$SESSION中的数据实际也会存放其他的信息,如id等
session_unset():释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的sessionid。
session_destroy():注销session,删除当前用户对应的session文件以及释放sessionid,切断了客户端和服务端的联系,内存中的$_SESSION变量内容依然保留。
二、Include原理
把被include的文件按照HTML去解析,然后把输出内容替代include语句的位置
顺带提一下,PHP官方对于require和include区别的解释:require遇到错误会抛出致命错误,而include只会抛warning
require() is identical to include() except upon failure it will also
produce a fatal E_COMPILE_ERROR level error. In other words, it will
halt the script whereas include() only emits a warning (E_WARNING)
which allows the script to continue.See the include() documentation
for how this works.
三、命名空间
命名空间好比是磁盘上划分的不同文件夹,用来保存同名文件,使用namespace + 空间名字定义。
(1)、命名空间基础
- 命名空间的定义必须写在脚本最前面,通常一个脚本只会定义一个空间
(2)、命名空间子空间
- 子空间其实就是路径的分层
- 子空间可以基于已有空间创建,也可以直接创建,使用反斜杠\分隔
# 基于已有父空间
namespace father;
namespace father\son;
#直接创建子空间
namespace father\son;
★(3)、命名空间的访问
- 非限定名称:直接访问元素名
- 限定名称:带空间名字,而且是基于当前空间的子空间(相对路径)
- 完全限定名称:从全局空间(根目录)开始访问(绝对路径)
★(4)、命名空间的引入
- 将另外空间的元素引入到当前空间来,当作当前空间的元素访问
(1) 空间引入语法:use关键字,元素关键字默认是class,可以是function和const
use [元素关键字] 空间名\元素名
注:这里的空间名是一级空间
可引入多个元素:use [元素关键字] 空间名\元素名,空间名\元素名···
(2) 引入空间(全部元素)语法:
use 空间名;
这种方式的话,被引入空间的元素不允许直接使用非限定名称访问,必须使用被引入空间的最后一级空间+元素访问(不常使用,引入方便但是使用不方便)所以最好还是加上元素名。
(3) 别名:引入的元素换成其他合适的名字
use [元素关键字] 空间名\元素名 as 别名;
(5)、全局空间
- 所有空间都是从全局空间分离出来的
- 所有不指定空间的元素本质都属于全局空间
- 在某子空间访问系统函数时会升级到全局空间找,系统类不会升级到全局空间找
- 访问全局空间的内容,在前面加上反斜杠“\”
四、类的加载
- 手动加载:主动在调用之前手动加载即可
- 自动加载:__autoload():实现好自动加载函数,在使用类前声明好
- 自动加载sql_autoload_register():自定义加载函数,在使用类前通过spl注册