define() 和const的区别
- 两者都是定义常量使用
- const 是语言结构, define 是函数
- const 可在类中使用, define 不可以
- const 可以不同命名空间定义相同名称的常量, define 不可以
- const 大小写敏感, define 默认敏感, 可通过第三个参数为 true 设置为不敏感
include 和require的区别
-
require 是无条件包含, 也就是如果一个流程里加入 require , 无论条件成立与否都会先执行 require , 当文件不存在或者无法打开的时候, 会提示错误, 并且会终止程序执行
-
include有返回值, 而require没有 (可能因为如此 require 的速度比 include 快), 如果被包含的文件不存在的话, 那么会提示一个错误, 但是程序会继续执行下去
单引号和双引号的区别
- 单引号不解析变量,双引号解析变量
- 单引号只可解析单引号及转义符本身,双引号可解析更多的特殊字符。例: \n、\r、\t
- 解析速度不同,因单引号不考虑变量解析,所以比双引号要快
传值和引用的区别
- 按值传递 :函数范围内对值的任何改变在函数外部都会被忽略
- 按引用传递 :函数范围内对值的任何改变在函数外部也能反映出这些修改, 因为传引用传的是内存地址。
- 优缺点:按值传递时, php 必须复制值。特别是对于大型的字符串和对象来说, 这将会是一个代价很大的操作。按引用传递则不需要复制值, 对于性能提高很有好处。
cookie 与 session 的区别, 禁用 cookie 后如何传递 session
cookie
Cookie 是一段不超过 4KB 的 小型文本信息,是网站为了辨别用户身份,而 存储在用户本地终端上的数据。
Cookie 由 key:value、Expires属性、Path属性、Domain属性、Secure属性、HTTPOnly 属性 组成。
key:value : 设置 Cookie 的名称及相对应的值。
Expires属性 : 设置 Cookie 的生存周期。
生存周期有两种类型 : 会话性 与 持久性 。
会话性 : 不设置 cookie 过期时间 时为 会话性 Cookie,仅保存在浏览器内存中,并在用户关闭浏览器时失效。比如: 用户登录之后,此时用户信息 Cookie 保存在浏览器中,当用户关掉浏览器后,再次打开网站就需要再次登录。
持久性 : 设置 Cookie 过期时间 时为 持久性 Cookie,持久性 Cookie 会保存在用户硬盘中,直到 Cookie 过期或主动退出(清除 Cookie)时才会失效。
Path属性 : 规定 Cookie 的服务器路径。
如果路径设置为 “/”,那么 Cookie 将在整个域名内有效.如果路径设置为 “/test/”,那么 Cookie 将在 test 目录下及其所有子目录下有效。默认的路径值是 Cookie 所处的当前目录。
Domain属性 : 指定了可以访问该 Cookie 的 Web 站点或域。
为了让 Cookie 在 example.com 的所有子域名中有效,您需要把 Cookie 的域名设置为 “.example.com”。当您把 Cookie 的域名设置为 www.example.com 时,Cookie 仅在 www 子域名中有效。
Secure属性 : 指定是否使用HTTPS安全协议发送 Cookie。
HTTPOnly 属性 : 用于防止客户端脚本通过 document.cookie 属性访问 Cookie,有助于保护 Cookie 不被跨站脚本攻击窃取或篡改。
cookie的作用:
Cookie 用来跟踪用户身份,进行会话控制。因为 HTTP 是无状态协议,一次请求后,客户端与服务器就会关闭连接,以后用户再发起请求时,服务器不知道是哪个用户请求他,这时就用到 Cookie 了。
cookie的工作原理:
客户端浏览器发起请求 ( 用户打开网站,输入账号密码,点击登录)
服务器接收并响应 ( 服务器接收请求,创建 Cookie,将用户信息存入,并将 Cookie 返回客户端浏览器,浏览器将 Cookie 保存至内存或本地文件)
客户端之后再发起请求 ( 将 Cookie 一起发给服务器)
服务器接收并响应 ( 服务器收到 Cookie 后,可以识别是哪位用户进行操作,再进行处理)
php设置cookie:
// 语法
setcookie(name, value, expire, path, domain, secure);
$value = 'cookie value'; // Cookie 值
// 会话性 cookie
setcookie("testCookie", $value);
// 1小时过期的 cookie
setcookie("testCookie", $value, time()+3600);
// 删除 cookie, 将过期时间设置以过去时间
setcookie("testCookie", '', time()-1);
//-------------------------------------------
// PHP 获取 cookie
$testCookie = $_COOKIE['testCookie'];
SESSION
Session 同 cookie 一样,是网站为了辨别用户身份,而 存储在服务器端的数据。
通过为每个独立用户分配唯一的会话 ID,可以实现针对不同用户分别存储数据的功能。
Session的作用:Session 用来跟踪用户身份,进行会话控制或保持会话。
Session的工作原理:
客户端浏览器打开 cookie 时
客户端浏览器发起请求 ( 用户打开网站,输入账号密码,点击登录)
服务器接收并响应
服务器接收请求,开启 session session_start(),并随机生成唯一的32位的 session_id,创建以 session_id 命名的文件用来保存用户信息。通过 HTTP 响应头将 session_id 返回客户端浏览器,浏览器将 session_id 通过 cookie 保存至内存或本地文件中)
客户端之后再发起请求 ( 将 cookie 中的 session_id 一起发给服务器)
服务器接收并响应 ( 服务器收到 session_id 后,去寻找 session 文件中获取用户信息,识别是哪位用户进行操作,再进行处理)
php设置session: 在 php.ini 中 session.save_path 配置项找到 session 默认保存路径
// 初始化
session_start();
// 设置 session
$_SESSION['name'] = "Dom";
// 删除 session
if (isset($_SESSION['name'])) {
unset($_SESSION['name']);
}
Cookie 和 Session的区别
- 存储位置不同
Cookie 存储在浏览器内存或者客户端的硬盘中。
Session 存储在服务器的硬盘或数据库或缓存或等等中,但如果使用 cookie 保存 session_id 时,session 会依赖 cookie。 session 生成的 session_id 会返给客户端,客户端将 session_id 用 cookie 进行保存。
- 存储大小不同
cookie 存储大小 4k 左右, 不同浏览器限制 单个域名存储 cookie 的数量 也不一样。1个字母占1个字节,1个汉字占3个字节。
session 不限制大小,只限制生命周期。
- 性能程度不同
cookie 存储在浏览器或客户端本地文件中,访问速度快。
session 如果存储在服务器上,如果在某个时间段,访问量暴增,会占用服务器性能。
- 安全程度不同
session 相对 cookie ,session 比较安全。
防君子不防小人
浏览器禁用 cookie 后, 如何使用 session
1.通过url传值
# 通过 url 重写
https://www.baidu.com?sessid=123456
2.通过隐藏表单或ajax传值
<!-- html 隐藏表单 -->
<form name='testSID' action='/???'>
<input type='hidden' name='sessid' value='123456'>
</form>
// ajax 传值, 这里使用的是 jq
$.post("/???", {sessid: 123456}, function (res) {
});
3.修改 php.ini 中的 use_trans_sid
将 php.ini 中的 use_trans_sid=0 修改为 use_trans_sid=1, 就会检查客户端是否禁用 cookie,如果禁用,就会默认采用 第一种: 通过 url 传值 方式进行传递 sessionid
== 和 ===的区别
- == 要求两侧的值相同,弱类型判断
- === 要求两侧的值与类型都得相同
echo、print、print_r、var_dump 的区别
- print_r 与 var_dump 是函数, echo、print 是语句
- echo 用于输出数值变量或字符串,可以逗号分隔输出多个。数组输出 Array, 对象报错。例: echo $a, $b;
- print 用于输出数值变量或字符串, 不可输出多个。数组输出 Array, 对象报错。例: print $a;
- print_r 可简单输出 字符串、数字、数组、对象, 但 布尔(false)、null 都是打印 \n
- var_dump 可输出所有字符串、数字、布尔、数组、对象。包括键、值、类型、长度。
isset 与 empty 的区别
- isset 检测变量是否设置并且非 NULL
- empty 检测变量的值是否为 false, PHP 中 0、false、[]、‘0’ 、‘’ 所代表的布尔值都是 false
for 与 foreach 的区别,哪个更快?
- for 需要预先知道数组的长度, foreach 不需要
- foreach 效果要比 for 高,foreach 直接通过结构体中的 next 指针获取下一个值, 而 for 循环需要根据 key 先进行一次 hash 才得到值。