一 PHP基础1
1. Get 和 post 的区别
1.在
HTML
表单中使用method="get"
时,所有的变量名和值都会显示在URL
中。从带有GET
方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
2.带有POST
方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。带有POST
方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。
2. session和cookie区别
1 .
Cookie
是把用户的数据写给用户的浏览器。
2.Session
技术把用户的数据写到用户独占的session
中。
3.Session
对象由服务器创建,开发人员可以调用request
对象的getSession
方法得到session
对象。
cookie
存于客户端,session
存于服务器端。
4.cookie
的作用是与服务器进行交互,作为http
规范的一部分存在,而web storage
是为了在本地存储“数据”而生。
应用场景:
cookie
应用场景: ①判断用户是否登录过网站 ②用来记录购物车或者记录用户使用偏好来制定
session
应用场景:①登录验证信息
cookie
是网站为了标示用户身份而储存在用户本地终端(Client Side
)上的数据(通常经过加密)。
cookie
数据始终在同源的http
请求中携带(即使不需要),记会在浏览器和服务器间来回传递。
sessionStorage
和localStorage
不会自动把数据发给服务器,仅在本地保存。
- 有效期不同:
localStorage
:存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;sessionStorage
:数据在当前浏览器窗口关闭后自动删除。cookie
:设置的cookie
过期时间之前一直有效,即使窗口或浏览器关闭
- 作用域不同:
sessionStorage
:在打开的不同浏览器窗口不共享,既使是同一页面localStorage
:在同源页面共享cookie
:同源页面共享
- 存储大小:
cookie
数据大小不能超过4k
sessionStorage
和localStorage
虽然也有存储大小的限制,但比cookie
大得多,可以达到5M
或更大。
总结:
1、数据存放位置不同:
cookie
数据存放在客户的浏览器上,session
数据放在服务器上。
2、安全程度不同:cookie
不是很安全,别人可以分析存放在本地的COOKIE
并进行COOKIE
欺骗,考虑到安全应当使用session
。
3、性能使用程度不同:session
会在一定时间内保存在服务器上。当访问增多,会比较占用你 服 务器的性能,考虑到减轻服务器性能方面,应当使用cookie
。
4、数据存储大小不同:单个cookie
保存的数据不能超过4K
,很多浏览器都限制一个站点最多保存20
个cookie
,而session
则存储与服务端,浏览器对其没有限制。
3. PHP的Session机制和存储位置
Session
是通过一个名为PHPSESSID
的Cookie
来和服务器取得联系的,Session
通过sessionID(PHPSESSID 的值
)来找到对应服务器中Session
的文件名。sessionID
是在客户端和服务端通过HTTP Requset
和HTTP Response
传来传去的。sessionID
按照一定的算法生成,保证其值的唯一性和随机性。Cookie
里存储着Session
的sessionID
和Session
的生存期,如果没有设置Session
的生存期,则sessionID
存储在内存中,关闭浏览器时Session
失效,重新请求页面时会重新注册一个sessionID
。Session
是存储在服务器硬盘上的,在php.ini
中可通过session.save_path
设置Session
文件的存储路径,默认为服务器上的/tmp
目录。
4. 如何实现session共享
- 将 session 持久化至数据库
- 将 session 保存 至 Redis、Memcache
二 PHP基础2
1. 常用的php函数(数组函数,排序函数)
数组函数:
count()
reset()
explode()
split()
implode()
join()
array_merge()
array_reverse()
array_flip()
排序函数:
rsort() 函数用于对数组单元从高到低进行排序
asort() 函数用于对数组单元从低到高进行排序并保持索引关系
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系
ksort() 函数用于对数组单元按照键名从低到高进行排序
krsort() 函数用于对数组单元按照键名从高到低进行排序
// 常用
1. emplode()把字符串打散为数组
$str = "Hello world. I love Shanghai!";
// Array ( [0] => Hello [1] => world. [2] => I [3] => love [4] => Shanghai! )
print_r (explode(" ",$str));
2. Implode() 把数组元素组合为字符串
$arr = array('Hello','World!','I','love','Shanghai!');
// Hello World! I love Shanghai!
echo implode(" ",$arr);
3. join()把数组元素组合为一个字符串
$arr = array('Hello','World!','I','love','Shanghai!');
// Hello World! I love Shanghai!
echo join(" ",$arr);
4. array_merge():把两个数组合并为一个数组
$a1=array("red","green");
$a2=array("blue","yellow");
// Array ( [0] => red [1] => green [2] => blue [3] => yellow )
print_r(array_merge($a1,$a2));
5. array_reverse : 以相反的元素顺序返回数组
$a=array("a"=>"Volvo","b"=>"BMW","c"=>"Toyota");
print_r(array_reverse($a));
6. array_flip: 反转数组中所有的键以及它们关联的值
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$result=array_flip($a1);
// Array ( [red] => a [green] => b [blue] => c [yellow] => d )
print_r($result);
2. 写一个双向队列
从头入列 : array_unshift()
从头出列 : array_shift()
从尾入列 : array_push()
从尾出列 : array_pop()
3.PHP的异常处理发法:try catch,die和exit区别,自定义异常处理类
- 当
PHP
为脚本形式运行时,建议用exit()
:比如说Bash Shell
脚本语言,当它要停止运行时,会用exit()
函数终止脚本,并允许输出点内容到运行环境(一般是存储到一个全局变量中),但输出的内容只能是 数字,表示“命令的结束状态”。exit(123)
只是输出一种运行状态123
,而不是真的要向控制台输出字符串123
。- 当
PHP
为网站形式运行时,建议用die()
:die(数字)
,就没啥意义,因为它不会向页面输出 数字 字符串- 自定义异常处理类:自定义的
exception
类继承了PHP
的exception
类的所有属性,您可向其添加自定义的函数。可以为一段脚本使用多个异常,来检测多种情况。有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个"catch"
代码块中再次抛出异常。
问题: 遇到异常是怎么处理的?
try {
//1.申请的资源和要执行的代码逻辑
}catch(){
//2.捕获到的异常
}
4. 面向对象的特点与优点(封装/继承/多态)
封装:就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作
封装的实现
将属性进行私有化private
提供一个公开的set
方法,用于对属性判断并赋值
提供一个公开的get
方法,用于获取属性的值
继承:将若干类中相同的属性、方法抽取出来创建一个父类,其他的类不用在单独写共同的属性、方法。而只需要继承父类即可,继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
多态:就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会出现不同的状态。
多态的实现条件:
1.必须在继承体系下
2.子类必须要对父类中方法进行重写
3.通过父类的引用调用重写的方法
5. 简述 private、 protected、 public修饰符的访问权限。
- private : 私有成员, 在类的内部才可以访问。
- protected : 保护成员,该类内部和继承类中可以访问。
- public : 公共成员,完全公开,没有访问限制。
6. PHP 支持多继承吗?如何实现多继承?
不支持多继承, 但可以通过
Trait
实现。
7.类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。
定义常量使用关键字const.
例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,
访问常量的格式都是类名加作用域操作符号(双冒号)来调用
即:类名 :: 类常量名;
8.作用域操作符::如何使用?都在哪些场合下使用?
- 调用类常量
- 调用静态方法(使用
static
修饰的类方法)
9. PHP 错误级别介绍与设置错误级别的方式
PHP 官方手册有 16 个级别的错误
常见错误级别有:
E_ERROR : 致命的运行错误并阻止脚本执行
E_WARNING : 运行时警告
E_PARSE : 解析错误
E_NOTICE : 注意
E_USER_ERROR : 用户生成的错误消息
E_USER_WARNING : 用户生成的警告
E_USER_NOTICE : 用户生成的注意
E_ALL : 所有的错误、警告、注意
设置错误级别的方式
- 修改
php.ini
配置文件
例:error_reporting = E_ALL & ~E_NOTICE
, 表示报告除E_NOTICE
之外的所有错误。error_reporting
函数设置
例:error_reporting(E_ERROR | E_WARNING);
10. 在PHP中error_reporting这个函数有什么作用?
设置PHP的报错级别并返回当前级别
11. PHP的垃圾回收机制/GC回收机制是什么?
PHP
与其它语言一样,会有垃圾回收机制,就是我们所说的GC机制
,能够销毁内存空间,防止内存溢出.
PHP的垃圾回收机制利用引用计数的机制来确定是否需要回收,简单来说,就是引用计数为0
的变量可以进行回收,而这些变量存在于一个"zval"
的变量容器
中,容器中包含了变量的类型和值,以及2
个字节的信息,一个是标识变量是否是引用集合,用于分开普通变量和引用变量,另一个是"refcount"
,用于确定指向此变量的个数,即引用的个数。GC回收机制
可以通过修改PHP
配置开实现开启和关闭。
三 PHP基础3 - 对比篇
1. define()
与 const
区别
两者都是定义常量使用
const
是语言结构,define
是函数
const
可在类中使用,define
不可以
const
可以不同命名空间定义相同名称的常量,define
不可以
const
大小写敏感,define
默认敏感, 可通过第3
个参数为true
设置为不敏感
2. include
和 require
的区别是什么?
require
是无条件包含, 也就是如果一个流程里加入require
, 无论条件成立与否都会先执行require
, 当文件不存在或者无法打开的时候, 会提示错误, 并且会终止程序执行include
有返回值, 而require
没有 (可能因为如此require
的速度比include
快), 如果被包含的文件不存在的话, 那么会提示一个错误, 但是程序会继续执行下去
在失败的时候
- include产生一个warning,而require产生直接产生错误中断
- require在运行前载入,include在运行时载入
为避免多次包含同一文件,可用什么语句代替它们?
require_once
include_once
3. 传值与传引用的区别
- 按值传递 :函数范围内对值的任何改变在函数外部都会被忽略
- 按引用传递 :函数范围内对值的任何改变在函数外部也能反映出这些修改, 因为传引用传的是内存地址。
- 优缺点:按值传递时,
php
必须复制值。特别是对于大型的字符串和对象来说, 这将会是一个代价很大的操作。按引用传递则不需要复制值, 对于性能提高很有好处。
4. ==
与 ===
的区别
==
要求两侧的值相同,弱类型判断
===
要求两侧的值与类型都得相同
5. echo
、print
、print_r
、var_dump
的区别
print_r
与var_dump
是函数,echo
、echo
用于输出数值变量或字符串,可以逗号分隔输出多个。数组输出Array,
对象报错。例:echo $a, $b;
Array
, 对象报错。例:print $a;
print_r
可简单输出 字符串、数字、数组、对象, 但 布尔(false)
、null
都是打印\n
var_dump
可输出所有字符串、数字、布尔、数组、对象。包括键、值、类型、长度。
6. char
与 varchar
的区别
char
是定长字符串, 根据定义的字符长度分配足量的空间。varchar
是变长字符串, 比定长字符串节省空间。- 存储长度:
char
最大长度255
字符,varchar
65535
个字符- 存储方式:
char
英文1
个字节, 汉字2
个字节;varchar
中英文都为2
个字节- 定长: char 为定长字符串, 不足长度部分用隐藏空格填空, varchar 为变长字符串
- 占用空间:
char
会浪费空间,varchar
节省空间- 查询效率:
char
比varchar
更快, 因为char
在查询时直接查询查询固定长度。但数据量不同、索引是否命中, 实际结果可能有所偏差。
7. foo()和@foo()之间有什么区别?
@代表所有warning忽略
8. isset 与 empty 的区别
1.isset 检测变量是否设置并且非 NULL
2. empty 检测变量的值是否为 false, PHP 中 0、false、[]、‘0’ 、‘’ 所代表的布尔值都是 false
四 DB基础
三大范式?
- 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
- 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
- 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
1. 怎么样优化数据库性能
(1)创建索引,减少数据访问
(2)除去必要字段,创建数据分页(rownum
)用以返回更少数据
(3)尽量使用绑定变量来减少服务器cpu
开销防止注入,提高可读性
(4)尽量使用多表查询
(5)减少比较
2. 优化数据库设计的方法
(1)建立临时表
(2)建立索引
(3)提前将数据存到一张cache表中,从cache表中读取数据
(4)优化语句
3. 事务处理
为什么需要事务处理?
事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果
事务的四大特性?
事务是一组原子性的SQL
语句,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组操作的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
- 原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态;
- 一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;
- 隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的
100%
隔离,需要牺牲速度。- 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。
4. drop
、delete
、truncate
的区别
drop
命令用于删除数据表, 删除后此表不存在:drop table 表名;
delete
命令用于删除表数据, 删除后可恢复:delete from 表名 where 列名=条件值
*truncate
命令用于删除所有表数据同时使自增值初始至1:truncate 表名
参考资料
[1] PHP基础 - PHP中文网
[2] Mysql基础面试题 - 简书