2023php后端面试题整合(最全附答案)2023/11/20更新

一、前言

点开这个文章,说明你已经准备在找工作了,首先我给你投递公司的顺序建议
首先是一两家公司预热一下,然后比较心仪的很有把握的公司,然后才是非常心仪的公司,最后是选择 性的面试。
安排这个顺序主要是,虽然可能你业务很厉害,但是进入面试状态时需要一个过程的,面试预热很有必要,提前选择比较心仪的很有把握的公司,主要是为了拿到offer,一是做自我价值验证,二是心中有底气。这里顺便强调下面试提前准备,比如看下面试题,复习下技术书籍都很有必要的。

二、非技术问题

1. 简单自我介绍

咬字清晰,自信,不要有过多的停顿,介绍尽量长一点,一来可以压缩面试官问你问题的时长,二来还可以带动面试官问你的问题,因为其实有些面试官也不知道问什么,他就会根据你的自我介绍来问,可以按照下面的内容来说

1.姓名,学历,专业,学过什么,学习能力,证书奖项
2.精通的专业知识
3.上一份工作负责那些项目,使用什么技术,什么职位,
4.最大最骄傲的是什么项目,为什么,负责里面的什么模块
5.你负责的模块有哪些难题?怎么解决的

2. 未来的职业规划(这个可以提前想好,很多hr喜欢问)

如果想继续提升技术,可以简概自己今后的学习路线
在这里插入图片描述

3. 为什么从上家公司离职?(提前想好就行)

注意尽量少说公司,领导辣鸡之类的,懂得都懂

三、技术问题

其实php能问的东西挺少的,下面的整合一些自己去面试经常被问的一些问题,希望对你有所帮助。

1. Mysql知识

(1)mysql索引知识
MySQL索引是用于提高数据库查询性能的一种数据结构。索引可以使查询更加高效,减少数据扫描的时间,从而加快查询速度。以下是关于MySQL索引的一些重要知识:

1. 索引类型:
   - 主键索引(Primary Key Index):用于唯一标识每一行数据的索引,一张表只能有一个主键索引。
   - 唯一索引(Unique Index):要求值在索引列中唯一,但允许有空值。
   - 普通索引(Normal Index):最基本的索引类型,用于加快查询操作的速度。
   - 全文索引(Full-Text Index):用于全文搜索,可以匹配关键词的出现频率、位置等。

2. 创建索引:
   - 在表创建时添加索引:可以在CREATE TABLE语句中使用INDEX关键字来为一个或多个列创建索引。
   - ALTER TABLE命令:使用ALTER TABLE语句可以为已经存在的表添加索引。
   - CREATE INDEX命令:使用CREATE INDEX语句可以在已经存在的表上添加索引。

3. 索引的优势和劣势:
   - 优势:加快查询速度,减少数据扫描的时间;提高数据的唯一性和完整性;加速表的连接(JOIN)操作。
   - 劣势:占用更多的存储空间;对于插入、更新和删除操作,需要额外的维护工作;过多或不正确的索引可能导致性能下降。

4. 聚集索引和非聚集索引:
   - 聚集索引(Clustered Index):物理上决定了表中数据的存储顺序,一个表只能有一个聚集索引。
   - 非聚集索引(Non-Clustered Index):不影响表中数据的物理存储顺序,一个表可以有多个非聚集索引。

5. 索引使用的注意事项:
   - 根据查询需求创建合适的索引,选择适当的索引类型。
   - 避免过多的索引,只为常用的查询列创建索引。
   - 更新频繁的列不适合创建索引。
   - 定期维护和优化索引,删除不必要或重复的索引。

了解和正确使用MySQL索引可以大大提高数据库查询性能,但需要根据实际需求和数据特点做出权衡和选择。在数据库设计和查询优化中合理使用索引是非常重要的一环。

(2) 数据库的优化
1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离
2.从储存层: 采用合适的存储引擎,采用三范式
3.从设计层: 采用分区分表,索引,开启mysql缓存
4.sql语句层:采用效率高,速度快节省资源的sql语句执行
(3) 如何通俗地理解三个范式?
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性(通常使用主键来完成)
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余
(一个字段的内容重复出现多次或者可以在另一张表中可以推算出来的数据 即为冗余数据)
(4) Mysql的存储引擎,myisam和innodb
(6)什么是事务?及其特性?
如果任何一个sql语句操作失败那么整个操作就被失败,操作会回滚到操作前状态语句要么执行,要么不执行
事务特性:
A、原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。
B、一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
C、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务
D、持久性。事务正确提交,结果将永久保存在数据库,即使之后出现其他故障,事务处理结果也会得到保存
(7)查看sql语句的效率(explain关键字)
输入sql语句“EXPLAIN select * from users”,
前面加了EXPLAIN,则查询语句在执行时,会记录执行过程效率。

explain命令展示MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
注:explain只对select查询做解释,insert、update、delete不会
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
(8)sql查询优化

(参考:那些常见的sql优化_1.项目中常见的sql优化有哪些?-CSDN博客

1.首先应考虑在 where 及 order by 涉及的列上建立索引。索引不能过多,不利于删除,插入等操作。
2.应尽量避免在 where 子句中对字段进行 null 值判断,将导致引擎放弃使用索引而进行全表扫描
3.应尽量避免在 where 子句中使用!=或<>操作符,将引擎放弃使用索引而进行全表扫描
4.应尽量避免在 where 子句中使用 or 来连接条件,将导致引擎放弃使用索引而进行全表扫描
5.合理使用like模糊查询,不要乱用
6.不要在 where 子句中进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
7.不要写一些没有意义的查询
8.很多时候用 exists 代替 in 是一个好的选择
9.选择合适的字段类型,尽量使用数字型字段。
15.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间
16.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
17.避免频繁创建和删除临时表,以减少系统表资源的消耗。
(9)mysql主从复制,读写分离
主从复制原理,多台数据库服务器,一台做主,其他做从数据库,主数据库更新修改删除操作,都会同步到从数据库,类似备份的效果。
主从复制、读写分离一般是一起使用的。
目的很简单,就是为了提高数据库的并发性能。
你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。
如果有三台MySQL,一台mater只负责写操作,
两台salve只负责读操作,性能不就能大大提高了吗?
所以主从复制、读写分离就是为了数据库能支持更大的并发。

优点:
(1) 在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从
库读,降压)
(2) 在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
(3) 当主服务器出现问题时,可以切换到从服务器。(提升性能)

2. linux知识

(1)Linux基本命令

具体可以看我另一篇文章:linux一些常用指令分享-CSDN博客

reboot 重启
cd 路径切换
ls 列出指定目录信息
pwd 显示工作路径 
下载、解压
1)对于.tar结尾的文件 
  tar -xf all.tar 
2)对于.gz结尾的文件 
  gzip -d all.gz 
  gunzip all.gz 
 zip all.zip *.jpg 
  这条命令是将所有.jpg的文件压缩成一个zip包 
unzip all.zip 
 这条命令是将all.zip中的所有文件解压出来
(2)linux常用命令

在这里插入图片描述

3. php知识

(1) php基础知识

可以看我另一篇文章:php学习笔记-CSDN博客

(2) 如何处理负载、高并发?
1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,
所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛云等
3、数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。
另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,升级服务器。
当然硬件成本比较高,我们往往从软件方面着手。目前最为广泛的负载均衡软件是Nginx、LVS、HAProxy
(3)权限管理(RBAC)的实现?
1.首先创建一张用户表:id name auto(保存格式为:控制器-方法)
2.然后在后台中创建一个基类控制器,控制器里封装一个构造方法
3.当用户登陆成功后,通过用户id获取保存在数据表中的auth数据
4.然后获取当前控制器和方法,然后把他们组装成字符串
5.将他与保存的auto字段数据比较,如果没有,就提示该用户没有权限,如果有就进行下一步操作
(4) redis和memecache的区别
(1)redis不仅支持简单的k/v类型的数据,还提供string,list,set,zset,hash等数据结构的存储
(2)redis支持master-slave(主一从)模型应用
(3)redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用,
	MemCached不支持数据持久化,断电或重启后数据消失
(4)redis单个value最大限制1GB,memcache只能保存1MB的数据
(5)如果redis只使用string类型,redis就可以被看作加上持久化特性的memcache
(6)memcache是多线程的(这是memcache优势之一),也就意味着阻塞情况少,
	而redis是单线程的,阻塞情况相对较多
总结:有持久化需求或者对数据结构和处理有高级要求的应用,选择redis
	redis适合保存频繁修改的数据,memcache适合保存频繁读取的数据,如文章、静态页面等
(5) 怎么保证促销商品不会超卖?
使用了redis的队列来实现。将要促销的商品数量以队列的方式存入redis中,
每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖。
这个操作起来很方便,而且效率极高
(6)微信支付的实现流程
1.微信认证服务号,并且开通了微信支付
2.下载微信支付SDK
3.登录微信支付平台,下载支付证书
4.下载官方的demo,修改相关配置,发起支付
(7) 怎么实现第三方登录?
第三方登陆主要是基于author协议来实现,下面简单说下实现流程:
1、首先我们需要以开发者的身份向第三方登陆平台申请接入应用,
	申请成功后,我们会获得一个appID和一个secrectID.
2、当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,
	此时把之前申请的appID和secrectID带给登陆授权页面。
3、用户登陆成功后即得到授权,第三方会返回一个临时的code给我们的网站。
4、我们的网站接受到code后,再次向我们的第三方发起请求,
	并携带接收的code,从第三方获取access_token.
5、第三方处理请求后,会返回一个access_token给我们的网站,
	我们的网站获取到access_token后就可以调用第三方提供的接口了,比如获取用户信息等。
	最后把该用户信息存入到我们站点的数据库,并把信息保存到session中,实现用户的第三方登陆。
(8)谈谈对MVC的认识?
他的好处是可以将界面和业务逻辑分离。
Model(模型),是程序的主体部分,主要包含业务数据和业务逻辑
View(视图),是程序呈现给用户的部分视图层
Contorller(控制器),是用来接收并处理一些数据交互
(9) get和post的区别?
(10) php魔术方法
__set()当程序试图写入一个不存在或者不可见的成员变量时,__set()方法包含两个参数,分别表示变量名称和变量值,两个参数都不可省略
__get()当程序试图调用一个未定义或不可见的成员变量时,__get()方法有一个参数,表示要调用的变量名
__sleep() 常用于提交未提交的数据,或类似的清理操作如果有一些很大的对象,但不需要全部保存,这个功能就很好用。 
__construct()  在类实例化对象的同时执行该函数 
__distruct() 在类实例化的对象销毁时执行
__call()对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。
__clone()克隆对象时被调用。如:$t=new Test();$t1=clone $t;
__toString()打印一个对象的时被调用。如echo $obj;或print $obj;
__isset()检测一个对象的属性是否存在时被调用。如:isset($c->name)。
__unset()unset一个对象的属性时被调用。如:unset($c->name)。 
__autoload()实例化一个对象时,如果对应的类不存在,则该方法被调用。
(11) 魔术常量
__LINE__
返回文件中的当前行号。
__FILE__
返回文件的信息
__FUNCTION__
返回函数名称(PHP 4.3.0 新加)
__CLASS__
返回类的名称(PHP 4.3.0 新加)
__METHOD__
返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
(12) apache和ngiux的区别
apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
apache 发展到现在,模块超多,基本想到的都可以找到
apache 更为成熟,少 bug ,nginx 的 bug 相对较多
apache 超稳定
apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
apache 在处理动态请求有优势,一般动态请求要 apache 去做,nginx 适合静态和反向
apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
总结:需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache 。
(13)302 401 403 500错误码意思
(14) php错误等级
php.ini中的错误报告等级默认情况下,PHP错误报告等级是E_NOTICE
E_ALL - 所有的错误和警告(不包括 E_STRICT)
E_ERROR - 致命性的运行时错误
E_WARNING - 运行时警告(非致命性错误)
E_PARSE - 编译时解析错误
E_NOTICE - 运行时提醒(这些经常是你代码中的bug引起的,也可能是有意的行为造成的。)
E_STRICT - 编码标准化警告,允许PHP建议如何修改代码以确保最佳的互操作性向前兼容性。
E_CORE_ERROR - PHP启动时初始化过程中的致命错误
E_CORE_WARNING - PHP启动时初始化过程中的警告(非致命性错)
E_COMPILE_ERROR - 编译时致命性错
E_COMPILE_WARNING - 编译时警告(非致命性错)
E_USER_ERROR - 用户自定义的错误消息
E_USER_WARNING - 用户自定义的警告消息
E_USER_NOTICE - 用户自定义的提醒消息
(15) 怎么查看php错误日志
1.修改php.ini中的配置,开启错误日志,并重新启动Web服务器
2.这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示
3.错误日志在路径/usr/local/error.log中查看
  • (16) 简单的正则

(详细查看:最全的正则表达式整理_正则表达式格式-CSDN博客

简单手机号码的匹配:
$g = "/^1[34578]\d{9}$/"; 
配出所有的手机号就可以这样写:
preg_match_all("/^1[34578]\d{9}$/", $str, $mobiles);
(17)composer的使用
composer -V 查看版本号
composer -help 查看命令帮助
composer self-update 升级composer
composer install 重新安装
(18)swoole

(具体可以看:https://blog.csdn.net/qq_36303853/category_11316940.html

swoole是披着PHP外衣的C程序:其实就是c、java那些语言里面的高阶功能
swoole做为一种网络通信框架,解决php缺失的功能:比如多线程、异步通信、持久连接等
php+swoole能做:比如 游戏服务器、在线聊天系统等
(19)设计模式

(详细参考:https://www.cnblogs.com/lxwphp/p/10484661.html

(20) AJAX的优势是什么
(21)对于大流量的网站,您采用什么样的方法来解决访问量问题?
A、有效使用缓存,增加缓存命中率
B、使用负载均衡
C、对静态文件使用cdn进行存储和加速
D、想法减少数据库的使用
E、查看出现统计的瓶颈在哪里
F、反向代理
(22) 你所知道的php数组相关的函数?
array()----创建数组
array_combine()----通过合并两个数组来创建一个新数组
range()----创建并返回一个包含指定范围的元素的数组
compact()----建立一个数组
array_chunk()----将一个数组分割成多个
array_merge()----把两个或多个数组合并成一个数组
array_slice()----在数组中根据条件取出一段值
array_diff()----返回两个数组的差集数组
array_intersect()----计算数组的交集
array_search()----在数组中搜索给定的值
array_splice()----移除数组的一部分且替代它
array_key_exists()----判断某个数组中是否存在指定的key
shuffle()----把数组中的元素按随机顺序重新排列
array_flip()----交换数组中的键和值
array_reverse()----将原数组中的元素顺序翻转,创建新的数组并返回
array_unique()----移除数组中重复的值
(23) php递归操作
$arr = [
    [
        'id' => 1,
        'name' => '家用电器1',
        'p_id' => '0',
    ],[
        'id' => 2,
        'name' => '家用电器2',
        'p_id' => '0',
    ],[
        'id' => 3,
        'name' => '家用电器3',
        'p_id' => '0',
    ],
    [
        'id' => 4,
        'name' => '家用电器4',
        'p_id' => '1',
    ],
    [
        'id' => 5,
        'name' => '家用电器5',
        'p_id' => '1',
    ],
    [
        'id' => 6,
        'name' => '家用电器6',
        'p_id' => '3',
    ],
    [
        'id' => 7,
        'name' => '家用电器7',
        'p_id' => '3',
    ]
];

function data_format($arr, $level = 0, $id = 0)
{
    $list = [];
    foreach ($arr as $vo) {
        if ($vo['p_id'] == $id) {
            $temp_list = data_format($arr, $level + 1, $vo['id']);
            $vo['children'] = $temp_list;
            $list[] = $vo;
        }
    }
    return $list;
}
var_dump(data_format($arr));
(24) php写一个冒泡排序
function BubbleSort(array $arr)
{
	for ($i=0 ; $i <count($arr) ; $i++) { 
		//设置一个空变量
		$data = '';
		for ($j=$i ; $j < count($arr)-1 ; $j++) { 
			if ($arr[$i] > $arr[$j+1]) {
				$data      = $arr[$i]; 
				$arr[$i]   = $arr[$j+1];
				$arr[$j+1] = $data; 
			}
		}
	}
	return $arr;
}
(25)php写一个快速排序
function quick_sort($arr)
{
    $left=$right=array();
    //使用for循环进行遍历,把第一个元素当做比较的对象
    for($i=1;$i<$length;$i++)
    {
        //判断当前元素的大小
        if($arr[$i]<$arr[0]){
            $left[]=$arr[$i];
        }else{
            $right[]=$arr[$i];
        }
    }
    //递归调用
    $left=quick_sort($left);
    $right=quick_sort($right);
    //将所有的结果合并
    return array_merge($left,array($arr[0]),$right);
}
(26)单点登陆(SSO)
定义:在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。
原理就是写cookie,cookie或者存储带验证信息的token
(27)正反向代理
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,
客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,
并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

可以这么认为,对于正向代理,代理服务器和客户端处于同一个局域网内;而反向代理,代理服务器和源站则处于同一个局域网内。
(28)负载均衡

一台计算机的计算资源是有效的,当超大流量请求时,就可能导致请求等待或者服务器死机的情况,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

在这里插入图片描述

(29)nginx反向代理和正向代理的区别

1)正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
在这里插入图片描述从上图我们可以看出,所谓的正向代理 就是 代理服务器C 代替 用户A 访问 服务器B 。用户A 本身 无法访问 服务器B,隐藏访问着的行踪:服务器B 不知道真想访问 它的是 用户A ,认为是代理服务器B访问了。
通俗的来讲就是,a想向b借钱,但是b不给,c认识a和b,于是a请求c帮忙问b借来钱,但是b并不知道钱是给a的。
2)反向代理:刚好和正向代理相反,对于客户端而言,代理服务器就像真实服务器,客户端不需要进行任何设置。客户端 向 代理服务器 发送请求 ,代理服务器将 经过判断之后 将 请求 转发给 原始服务器
在这里插入图片描述
用户其实是不知道后端还有真实服务器存在,只知道自己访问的网站是就是自己想要的服务器网站(代理服务器)。
通俗的来讲就是,a向c借钱,但是a不知道这个钱具体是哪来的,其实是e或b或d给的,但是a不知道。

(30) seo优化

php网站进行SEO优化的4点经验_网创网

(31)接口安全验证
(1).请求头里带用户username和password,到服务器端做验证,通过才继续下边业务逻辑。
优点:防止了服务器端api被随意调用。
缺点:每次都交互用户名和密码,交互量大,且密码明文传输不安全。
(2).第一次请求,要求username和password,验证通过,种cookie到客户端,app保	存cookie值。每次请求带上cookie。
(3).制定一个token生成规则,按某些服务器端和客户端都拥有的共同属性生成一个随	机串,客户端生成这个串,服务器收到请求也校验这个串。
缺点:随机串生成规则要保密。
比如:一个使用php框架的工程,框架每次交互都会有 module和action两个参数做路由,这样的话,我就可以用下边这个规则来生成token
app要请求用户列表,api是“index.php?module=user&action=list”
app生成token = md5sum ('user'.'2012-11-28'.'#$@%!'.list) = 880fed4ca2aabd20ae9a5dd774711de2;
实际发起请求为 “index.php?module=user&action=list&token=880fed4ca2aabd20ae9a5dd774711de2”
服务器端接到请求用同样方法计算token
(32) 密码加密方式

详情可以查看网站:php中的六种密码加密方式分别是什么-猿圈-程序猿的知识社区

不可逆加密:MD5、hash、crypt、sha1
可逆加密:URL编码(urlencode())、base64编码(base64_encode())

(33)各个开源框架的区别

404 Not Found

(34)安全攻击

6个常见的 PHP 安全性攻击实例和阻止方法_php实例_脚本之家

(35)设计模式

http://c.biancheng.net/view/7563.html

(36)tcp/udp的区别

当我们谈论TCP(传输控制协议)和UDP(用户数据报协议)时,我们实际上在讨论不同的方式来传输数据。

TCP是一种可靠的协议,它的重点是确保数据的完整性和准确性。它使用了一些机制来确保数据从发送方传输到接收方时不会丢失或损坏。TCP通过建立连接、分片数据、排序和确认等方式来保证数据的完整性,它适用于需要可靠传输的应用程序,比如文件传输和网页浏览。

UDP则是一种不可靠的协议,它更加简单和轻量。UDP不提供数据的可靠性保证,它只是简单地将数据从发送方发送到接收方。UDP不建立连接,也不进行数据重传或者确认。它适用于一些实时性要求较高且对数据完整性要求较低的应用程序,比如音频、视频和实时游戏。

换句话说,TCP注重数据的完整性和可靠性,而UDP注重传输的速度和实时性。选择使用哪种协议取决于应用程序的需求。如果应用程序需要可靠的数据传输,那么TCP是更好的选择;如果应用程序需要快速传输并且可以容忍一些数据丢失,那么UDP可能更适合。

当涉及到具体的应用场景时,以下是一些常见的情况:

TCP的应用场景:

  1. 文件传输:当你需要确保文件在传输过程中不会丢失或损坏时,TCP是首选协议。例如,通过FTP(文件传输协议)下载或上传文件。
  2. 网页浏览:当你浏览网页时,你需要确保页面上的所有内容都能够正确加载,包括文本、图像和视频等。TCP确保了这些内容的可靠传输。
  3. 电子邮件传输:邮件中的内容是非常重要的,不能有任何的丢失或损坏。因此,SMTP(简单邮件传输协议)使用TCP来传输邮件。

UDP的应用场景:

  1. 视频和音频流媒体:在实时直播或者视频会议中,需要快速传输数据以保持实时性。UDP可以提供较低的延迟,适用于实时性要求高的应用程序。
  2. 实时游戏:在线游戏通常需要快速响应和及时更新,对于更新频率高、处理速度要求高的游戏数据,UDP是常用的选择。
  3. DNS(域名系统):DNS查询需要快速响应,UDP在这种情况下比TCP更适合,因为查询是短暂的,丢失一些数据也不会对整体性能产生很大的影响。
(37)session跨服务器

在PHP中,默认情况下,$_SESSION变量是存储在服务器本地的会话存储区中的,无法直接跨服务器。
那么如何实现多个服务器之间共享会话数据呢?这里说一种方法:
使用共享存储方式:您可以将$_SESSION数据存储在共享的外部存储系统中,例如数据库、缓存服务器(如Redis、Memcached)、分布式文件系统(如NFS)。各个服务器在需要读写会话数据时,通过共享存储方式进行存取。

(38)面向对象知识

在PHP中,面向对象编程是一种常见的编程方式,并且在PHP面试中常被问及。以下是一些PHP面向对象编程的常见面试知识点:

  1. 类与对象:

    • 类是对现实世界中某个事物的抽象,它定义了对象的属性和方法。
    • 对象是类的实例化,它具有类定义的属性和方法。
  2. 封装、继承和多态:

    • 封装是将数据和方法(行为)封装在一个类中,通过公共方法来访问和操作数据。
    • 继承是一种机制,允许一个类继承另一个类的属性和方法。
    • 多态是指同一类操作可以在不同的实例中具有不同的行为。
  3. 访问修饰符:

    • 公有(public):公有成员可以在类的内部和外部访问。
    • 私有(private):私有成员只能在类的内部访问,无法在类的外部直接访问。
    • 受保护(protected):受保护成员可以在类的内部和继承类中访问,不能在类的外部访问。
  4. 构造函数与析构函数:

    • 构造函数是在创建对象时自动调用的方法,用于初始化对象的属性和执行一些必要的操作。
    • 析构函数是在对象被销毁时自动调用的方法,用于清理资源和执行一些收尾操作。
  5. 抽象类与接口:

    • 抽象类是不能被实例化的类,它可以包含抽象方法(没有具体实现的方法)和普通方法。
    • 接口定义了一组方法的规范,类可以实现一个或多个接口,实现接口的类必须实现接口中定义的所有方法。
  6. 静态成员与静态方法:

    • 静态成员属于类而不是对象,可以通过类名直接访问。
    • 静态方法是在类级别上调用的方法,不需要通过对象实例来访问。

这些是常见的PHP面向对象编程的面试知识点,深入理解这些概念并能够在实践中灵活运用将有助于你在面试中展现出对面向对象编程的掌握程度。

(39) 面向对象何面向过程编程的区别

面向对象编程(OOP)和面向过程编程(Procedural Programming)是两种不同的编程范式,它们之间存在一些重要的区别。

  1. 数据和方法的组织方式不同:

    • 面向对象编程:OOP将数据和相关的方法封装在一个单独的实体中,即对象。对象通过类来定义,类描述了对象的属性和行为。这种封装的方式使得代码更加模块化和可重用。
    • 面向过程编程:面向过程编程以过程为中心,将数据和操作数据的函数分开。数据通常被全局或局部变量所引用,而函数对这些数据进行操作,多个函数之间可能共享相同的数据。
  2. 抽象性和灵活性不同:

    • 面向对象编程:OOP通过抽象、封装、继承和多态等概念提供了更高的抽象级别和灵活性。对象和类可以模拟现实世界中的实体和关系,通过类的继承和多态,可以在运行时动态地切换和扩展功能。
    • 面向过程编程:面向过程编程通常更加关注具体的过程和流程,较少使用抽象概念。代码的组织和逻辑往往更加直观明确,但灵活性较低。
  3. 代码的复用方式不同:

    • 面向对象编程:OOP通过类的继承和对象的实例化来实现代码的复用,在需要扩展或修改功能时,可以通过扩展现有类或创建新的类来达到目的。
    • 面向过程编程:面向过程编程通常通过将一段代码作为一个函数,在需要的地方直接调用函数来实现代码的复用。

选择使用面向对象编程还是面向过程编程取决于项目的需求和个人偏好。面向对象编程通常更适合大型复杂的项目和长期的维护,而面向过程编程则适用于简单的、流程驱动的问题。实际开发中,也可以在不同的编程范式之间灵活切换和结合使用。

(40) php如何实现多继承

在 PHP 中,单继承是语言特性,只允许一个类从另一个类继承,但可以通过其他方式实现类似于多继承的效果。

一种常见的实现多继承的方式是使用特征(Traits)
具体可以看我这篇文章:PHP之Trait详解(多继承)

特征是可以在不同的类中共享代码的一种机制。通过使用特征,一个类可以在继承一个类的同时,使用一个或多个特征中的方法和属性。以下是一个使用特征实现多继承的示例:

trait Trait1 {
    public function method1() {
        // 方法1的实现
    }
}

trait Trait2 {
    public function method2() {
        // 方法2的实现
    }
}

class MyClass {
    use Trait1, Trait2;

    // 类的其余代码
}

$obj = new MyClass();
$obj->method1(); // 调用 Trait1 中的 method1 方法
$obj->method2(); // 调用 Trait2 中的 method2 方法

在上面的示例中,Trait1 和 Trait2 是两个特征,MyClass 类使用 use 关键字来使用这两个特征。这样,MyClass 类就可以使用 Trait1 和 Trait2 中定义的方法。

除了特征,还可以使用接口组合来实现类似于多继承的效果。通过定义多个接口,并让一个类实现这些接口,可以实现多个不同类的功能的组合。这样,该类可以具备多个类的方法和行为。

虽然 PHP 并没有直接支持多继承,但通过使用特征和接口组合等技术,可以实现类似于多继承的效果,使一个类具备多个类的功能和行为。

(41) php8新特性

PHP 8相对于之前的版本引入了一些重要的新特性和改进。以下是PHP 8与之前版本相比的一些新特性:

  1. JIT 编译器:PHP 8引入了名为"Tracing JIT"的即时编译器,通过动态地将热点代码编译成本机机器码,提高了PHP代码的执行性能。

  2. 类型系统改进:

    • 类型声明的改进:PHP 8增加了更强大的类型声明功能,包括更严格的参数类型声明、返回类型声明和属性类型声明。
    • 新增的原始类型:PHP 8新增了原始类型union(联合类型)和mixed(混合类型),允许更灵活地处理多个类型的变量。
  3. 新的语言特性:

    • Nullsafe 操作符:引入了"?->"操作符,可以简化对可能为null的对象属性和方法的访问。
    • Match 表达式:新增了match表达式,类似于switch语句,但更简洁和灵活。
    • 属性的静态访问限定词:允许以::操作符访问类的静态属性。
  4. 异常的改进:

    • 新增Throwable接口:Throwable接口是Exception和Error的基本接口,可以捕获异常和错误。
    • 新增允许抛出的异常类型声明:现在可以指定抛出异常的具体类型,增加了代码的可读性和安全性。
  5. 其他改进:

    • 性能优化:PHP 8对语言运行时进行了各种优化,使得代码的执行速度更快。
    • New String Functions:引入了一些新的字符串函数,如str_contains、str_starts_with、str_ends_with等。

这些新特性使得PHP 8在性能、类型系统、语言特性和异常处理方面有了明显的提升,有助于提高代码的质量和开发效率。在面试中,了解并展示对PHP
8新特性的理解将有助于展现你对PHP的最新发展趋势的关注和兴趣。

四、完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,希望你不要吝啬自己的点赞评论和关注,第一时间告诉我,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

一位在小公司默默奋斗的开发者,出于兴趣爱好,如果你有任何问题,欢迎你来评论私信告诉我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 面试题的内容通常包括刷题、Java中的原始类型和封装类、String、StringBuilder、StringBuffer的区别及使用场景、final关键字的用法、sleep()和wait()的区别等。刷题是面试前期准备过程中非常重要的一点,可以帮助面试者熟悉面试过程中可能会问到的知识点和高频题。\[1\]在Java中,int是原始类型,而Integer是Java为int提供的封装类,它们有不同的特征和用法,包括大小、速度和默认值。\[2\]String、StringBuilder和StringBuffer是Java中用于处理字符串的类,它们之间的区别在于可变性和线程安全性,适用的场景也有所不同。\[2\]final关键字可以用于修饰属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可继承。而finally是异常处理语句结构的一部分,表示无论是否发生异常,都会执行其中的代码。finalize是Object类的一个方法,在垃圾回收执行时会调用被回收对象的此方法。\[3\]sleep()和wait()都可以用于线程的暂停,但它们的使用场景和效果不同。sleep()是Thread类的方法,用于暂停当前线程的执行一段时间,而wait()是Object类的方法,用于暂停当前线程的执行,同时释放对象的锁,直到其他线程调用notify()或notifyAll()方法唤醒它。\[3\]希望这些信息对你的面试准备有所帮助。 #### 引用[.reference_title] - *1* [2023年高频Java面试题集锦(含答案),让你的面试之路畅通无阻](https://blog.csdn.net/shy111111111/article/details/129317020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [2023年Java最新面试题详解答案](https://blog.csdn.net/JasonXu94/article/details/130461350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值