PHP面试基础题记录

一 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请求中携带(即使不需要),记会在浏览器和服务器间来回传递。
 
sessionStoragelocalStorage不会自动把数据发给服务器,仅在本地保存。

  1. 有效期不同:
  • localStorage:存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
  • sessionStorage:数据在当前浏览器窗口关闭后自动删除。
  • cookie:设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
     
  1. 作用域不同:
  • sessionStorage:在打开的不同浏览器窗口不共享,既使是同一页面
  • localStorage:在同源页面共享
  • cookie:同源页面共享
     
  1. 存储大小:
  • cookie数据大小不能超过4k
  • sessionStoragelocalStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。

总结:

1、数据存放位置不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全程度不同:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行 COOKIE 欺骗,考虑到安全应当使用session
3、性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占用你 服 务器的性能,考虑到减轻服务器性能方面,应当使用cookie
4、数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20cookie,而session则存储与服务端,浏览器对其没有限制。

3. PHP的Session机制和存储位置

  1. Session 是通过一个名为 PHPSESSIDCookie 来和服务器取得联系的,Session 通过 sessionID(PHPSESSID 的值)来找到对应服务器中 Session 的文件名。
  2. sessionID 是在客户端和服务端通过HTTP RequsetHTTP Response 传来传去的。sessionID 按照一定的算法生成,保证其值的唯一性和随机性。
  3. Cookie 里存储着 SessionsessionID Session 的生存期,如果没有设置 Session 的生存期,则 sessionID 存储在内存中,关闭浏览器时 Session 失效,重新请求页面时会重新注册一个 sessionIDSession 是存储在服务器硬盘上的,在 php.ini 中可通过 session.save_path 设置 Session 文件的存储路径,默认为服务器上的 /tmp 目录。

4. 如何实现session共享

  1. 将 session 持久化至数据库
  2. 将 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区别,自定义异常处理类

  1. PHP为脚本形式运行时,建议用exit():比如说 Bash Shell脚本语言,当它要停止运行时,会用 exit()函数终止脚本,并允许输出点内容到运行环境(一般是存储到一个全局变量中),但输出的内容只能是 数字,表示“命令的结束状态”。exit(123)只是输出一种运行状态123,而不是真的要向控制台输出字符串 123
  2. PHP为网站形式运行时,建议用die()die(数字),就没啥意义,因为它不会向页面输出 数字 字符串
  3. 自定义异常处理类:自定义的 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 : 所有的错误、警告、注意

设置错误级别的方式

  1. 修改 php.ini 配置文件
    例: error_reporting = E_ALL & ~E_NOTICE, 表示报告除 E_NOTICE 之外的所有错误。
  2. 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. includerequire 的区别是什么?

  • require 是无条件包含, 也就是如果一个流程里加入 require , 无论条件成立与否都会先执行 require , 当文件不存在或者无法打开的时候, 会提示错误, 并且会终止程序执行
  • include有返回值, 而require没有 (可能因为如此 require 的速度比 include 快), 如果被包含的文件不存在的话, 那么会提示一个错误, 但是程序会继续执行下去

在失败的时候

  • include产生一个warning,而require产生直接产生错误中断
  • require在运行前载入,include在运行时载入

为避免多次包含同一文件,可用什么语句代替它们?

require_once
include_once

3. 传值与传引用的区别

  • 按值传递 :函数范围内对值的任何改变在函数外部都会被忽略
  • 按引用传递 :函数范围内对值的任何改变在函数外部也能反映出这些修改, 因为传引用传的是内存地址。
  • 优缺点:按值传递时, php 必须复制值。特别是对于大型的字符串和对象来说, 这将会是一个代价很大的操作。按引用传递则不需要复制值, 对于性能提高很有好处。

4. ===== 的区别

== 要求两侧的值相同,弱类型判断
=== 要求两侧的值与类型都得相同

5. echoprintprint_rvar_dump 的区别

  • print_rvar_dump 是函数, echoprint 是语句
  • echo 用于输出数值变量或字符串,可以逗号分隔输出多个。数组输出 Array, 对象报错。例: echo $a, $b;
  • print 用于输出数值变量或字符串, 不可输出多个。数组输出 Array, 对象报错。例: print $a;
  • print_r 可简单输出 字符串、数字、数组、对象, 但 布尔(false)null 都是打印 \n
  • var_dump 可输出所有字符串、数字、布尔、数组、对象。包括键、值、类型、长度。

6. charvarchar 的区别

  • char 是定长字符串, 根据定义的字符长度分配足量的空间。
  • varchar 是变长字符串, 比定长字符串节省空间。
  • 存储长度: char 最大长度 255 字符, varchar 65535 个字符
  • 存储方式: char 英文1个字节, 汉字2个字节;varchar 中英文都为2个字节
  • 定长: char 为定长字符串, 不足长度部分用隐藏空格填空, varchar 为变长字符串
  • 占用空间: char 会浪费空间, varchar 节省空间
  • 查询效率:charvarchar 更快, 因为 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. dropdeletetruncate 的区别

  • drop 命令用于删除数据表, 删除后此表不存在: drop table 表名;
  • delete 命令用于删除表数据, 删除后可恢复:delete from 表名 where 列名=条件值
    * truncate 命令用于删除所有表数据同时使自增值初始至1:truncate 表名

参考资料

[1] PHP基础 - PHP中文网
[2] Mysql基础面试题 - 简书

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值