如果你正在寻找PHP开发的工作,那么提前掌握最新的PHP面试题技巧,必然能使你在求职过程中事半功倍。博主整理了最全面的PHP面试题,包括PHP基础面试题、PHP高级面试题以及PHP常见面试题!
1.PHP执行的时候有如下执行过程:Scanning(Lexing) - Compilation - Execution - Parsing,其含义分别为:
A、将PHP代码转换为语言片段(Tokens)、将Tokens转换成简单而有意义的表达式、顺次执行Opcodes、将表达式编译成Opocdes
B、将PHP代码转换为语言片段(Tokens)、将表达式编译成Opocdes、顺次执行Opcodes、将Tokens转换成简单而有意义的表达式
C、将PHP代码转换为语言片段(Tokens)、将Tokens转换成简单而有意义的表达式、将表达式编译成Opocdes、顺次执行Opcodes
D、将PHP代码转换为语言片段(Tokens)、将表达式编译成Opocdes、将Tokens转换成简单而有意义的表达式、顺次执行Opcodes
参考答案:C
答案解析:
正确答案为C
1).Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
2).Parsing, 将Tokens转换成简单而有意义的表达式
3).Compilation, 将表达式编译成Opocdes
4).Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。
2.不是php魔术常量的是?
A、__TRAIT__
B、__CALL__
C、__CLASS__
D、__FUNCTION__
参考答案:B
答案解析:
\_\_LINE\_\_ \_\_FILE\_\_ \_\_DIR\_\_ \_\_FUNCTION\_\_ \_\_CLASS\_\_ \_\_TRAIT\_\_ \_\_METHOD\_\_ \_\_NAMESPACE\_\_
3.php选项/信息函数作用错误的是?
A、phpinfo() 输出关于 PHP 配置的信息
B、php_sapi_name() 返回 web 服务器和 PHP 之间的接口类型
C、ini_set() 为一个配置选项设置值
D、ini_get() 获取所有配置选项
参考答案:D
答案解析:
ini\_get() 是获取一个配置选项,获取所有配置选项的函数是ini\_get\_all()
4.下列代码的输出是 ?
mother="son";echo$$father;
A、son
B、mother
C、motherson
D、error
参考答案:A
答案解析:
php里变量字符串之前加$等于指向另外一个字符串
5.下列对shell 变量FRUIT 操作,正确的是?
A、为变量赋值:$FRUIT=apple
B、显示变量的值:fruit=apple
C、显示变量的值:echo $FRUIT
D、判断变量是否有值:[ -f ―$FRUIT ]
参考答案:C
答案解析:
为变量赋值FRUIT=apple; 显示变量的值为C; 判断是否有值[-n $FRUIT];
6.以下不是线性表是?
A、数组
B、二叉树
C、队列
D、栈
参考答案:B
答案解析:
二叉树是树结构
7.以下哪个函数不是PHP的文件指针操作?
A、ftell()
B、fseek()
C、file()
D、feof()
参考答案:C
答案解析:
ftell() 返回文件指针位置 fseek() 在文件指针中定位 feof() 测试文件指针是否在结尾
关注微信公众号 “PHP大神” 回复“面试题”可以免费下载更多php相关面试题 ,整理不易请多关注,如有错误请多包涵哈!
8.关于线程的,说法错误的是?
A、线程是进程的一个实体,是CPU调度和分派的基本单位
B、它是比进程更小的能独立运行的基本单位
C、线程和进程一样拥有系统资源
D、线程自己基本上不拥有系统资源
参考答案:C
答案解析:
线程是指进程内的一个执行单元,也是进程内的可调度实体。线程自己基本上不拥有系统资源
9.GoAccess虽然很强大但是他不能做以下哪项工作?
A、生成统计数据带宽统计
B、可生成HTML报告
C、可发送HTTP请求
D、各HTTP状态码统计
参考答案:C
答案解析:
GoAccess:是一款开源、实时,运行在命令行终端下的web日志分析工具。该工具提供快速、 多样的HTTP状态统计,可以令管理员不再纠结于统计各类数据 GoAccess主要以统计为主
10.PHP的三个模块不包括哪个?
A、内核
B、zend引擎
C、扩展层
D、解析层
参考答案:D
答案解析:
PHP总共三个模块:内核、zend引擎、以及扩展层
11.CSRF***描述错误的是?
A、CSRF需要有JavaScript代码
B、CSRF***恶意代码位于第三方站点上
C、过滤用户的输入可以防止恶意代码注入到某个站点,但是它无阻止法恶意代码在第三方站点上运行
D、CSRF符合同源策略
参考答案:A
答案解析:
XSS***需要JavaScript代码,CSRF***不需要JavaScript代码
12.关于PHP数组在C语言中是哪种存储结构?
A、单链表
B、双链表
C、循环链表
D、二叉树
参考答案:B
答案解析:
双链表
13.关于组合模式,说法错误的是?
A、它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
B、定义了一种一对多的依赖关系,让多个观察者对象同时 监听某一个主题对象。这个主题对象在状态 发生变化时,会通知所有观察者对象,使他们能够自动更新自己
C、树枝和叶子实现统一接口,树枝内部组合该接口
D、将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
参考答案:B
答案解析:
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性 树枝和叶子实现统一接口,树枝内部组合该接口 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
14.数据结构的储存方式描述错误的是?
A、顺序存储用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构
B、链式存储在每一个数据元素中增加一个存放另一个元素地址的指针,用该指针来表示数据元素之间的逻辑结构
C、顺序结构数据元素存放的地址是连续的
D、数据算法的实现依赖于所采用的逻辑结构
参考答案:D
答案解析:
顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)。 链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer ),用该指针来表示数据元素之间的逻(需要更多学习资料和面试题请加入qun6/7/7/0/7/9/7/7/0)辑结构(关系) 顺序结构:数据元素存放的地址是连续的; 链式结构:数据元素存放的地址是否连续没有要求。 数据的逻辑结构和物理结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构
15.下面Http协议请求方式中不包括?
A、OPTIONS
B、HEAD
C、DELETE
D、SET
参考答案:D
答案解析:
没有SET
16.下边不是php的伪类型的是?
A、mixed
B、void
C、array|object
D、callable
E、以上都是
参考答案:E
答案解析:
答案是没有答案、php的伪类型包含 mixed: 说明返回可包含多种类型 number: 说明一个参数可以是 integer 或者 float callback或者callable: 说明可以是回调函数 array|object: 说明既可以是array也可以是object void: 说明返回值无意义、作为入参表示不接受任何参数 这里想说的是、我们要打破常规、有些a、b、c、d中并没有我们想要的、而不是每一个都必须有标准答案,重要的是我们学会一个知识点儿~、因为必须提交一个答案,所以~~~
17.文本文件和二进制文件的存取,错误的是?
A、用记事本打开二进制文件时, 出现乱码是很必然了
B、二进制文件还是文本文件, 在存储时都是一连串的0和1
C、打开方式是一样的
D、二进制文件最小单位则是位
参考答案:C
答案解析:
打开方式不同, 这些0和1的处理就不同
18.不是PHP加密函数的是?
A、openssl_encrypt
B、json_encode
C、mcrypt_encrypt
D、md5
参考答案:B
答案解析:
md5 sha1 mcrypt\_encrypt openssl\_encrypt
19.什么是PHP的多维数组
A、PHP的值是多种数据类型
B、PHP的值也是数组类型
C、PHP的索引有数字和字母
D、以上都是
参考答案:B
答案解析:
多维数组:数组中的值也是数组
20.下面哪一个正则表达式用来验证电子邮件(如: zhang.san_123@scse.com.cn )的格式最正确()
A、[_\.0-9a-z]@([0-9a-z]+\.)+[0-9a-z\.-]{2,6}
B、[_\.0~9a~z-]*@([0~9a~z-]+\.)+[0~9a~z\.]+
C、[_\.0-9a-z-]+@([0-9a-z-]+\.)+[0-9a-z\.]+
D、[_\.0~9a~z-]+@([0~9a~z-]+\.)+[0~9a~z]{2,6}
参考答案:C
答案解析:
C
<pre class="prettyprint lang-php">[_\.0-9a-z-]+@([0-9a-z-]+\.)+[0-9a-z\.]+ <span >zhang.san_123@scse.com.cn
@符号之前的字符出现的次数必须要>=1次,因此为"+" </span>([0-9a-z-]+\.)+表示的是@后面以字符加'.'构成的部分可以出现多次,也就是scse.com.(注意正则表达式的贪婪模式)
[0-9a-z\.]+ 表示的就是最后的cn <span > </span>
21.( )是一种客户端脚本语言,它采用解释方式在计算机上执行。
A、Python
B、Java
C、PHP
D、JavaScript
参考答案:D
答案解析:
JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
22.以下关于结构型模式说法错误的是?
A、结构型模式可以在不破坏类封装性的基础上,实现新的功能
B、结构型模式主要用于创建一组对象
C、结构型模式可以创建一组类的统一访问接口
D、结构型模式可以在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互
参考答案:B
答案解析:
结构型(structural):处理类或对象间的组合
23.下面关于数组和数据结构的说法错误的是?
A、栈 是 后进先出的线性表,可以随意写入和读取数据
B、队列 是先进先出的线性表,只允许后端插入,前端进行删除操作
C、php中可以用 array_push 入栈,arrar_pop 实现出栈
D、php中用array_push入列,array_shift 出列
参考答案:A
答案解析:
栈 只能在一端进行写入和删除的操作。
24.以下关于引用说法错误的是?
A、引用不是C的指针
B、引用不允许用两个变量来指向同一个内容
C、用引用可以传递变量
D、可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
参考答案:B
答案解析:
引用是允许用两个变量来指向同一个内容的
25.数组的遍历方式,下列错误的是?
A、foreach
B、each
C、for
D、list
参考答案:D
答案解析:
list只能把数组的元素变成变量,并不是遍历。
联合使用list()、each()和while循环遍历数组
each()函数需要传递一个数组作为一个参数,返回数组中当前元素的键/值对,并向后移动数组指针到下一个元素的位置。
list()函数,这不是一个真正的函数,是PHP的一个语言结构。list()用一步操作给一组变量进行赋值。
26.不能匹配数字的正则表达式是
A、^{0-9}*$
B、^\d{n}$
C、^\d{n,}$
D、^\d{m,n}$
参考答案:A
答案解析:
{}是元字符号,A缺少元字符
27.PHP运行模式哪个不适合做http服务?
A、cgi模式
B、fastcgi模式
C、isapi模式
D、cli模式
参考答案:D
答案解析:
cgi模式、fastcgi模式、isapi模式都可以提供http服务 cli模式不能提供http服务
28.在 Linux 中,文件( )用于解析主机域名。
A、etc/hosts
B、etc/host.conf
C、etc/hostname
D、 etc/bind
参考答案:A
答案解析:
etc/hosts 用于解析主机域名
关注微信公众号 “PHP大神” 回复“面试题”可以免费下载更多php相关面试题 ,整理不易请多关注,如有错误请多包涵哈!
1. php 的垃圾回收机制
PHP 可以自动进行内存管理,清除不需要的对象:
PHP 使用了引用计数 (reference counting) GC 机制。
每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。
2. session 与 cookie 的区别和联系
区别:
1. 存放位置:Session 保存在服务器,Cookie 保存在客户端。
2. 存放的形式:Session 是以对象的形式保存在服务器,Cookie 以字符串的形式保存在客户端。
3. 用途:Cookies 适合做保存用户的个人设置,爱好等,Session 适合做客户的身份验证
4. 路径:Session 不能区分路径,同一个用户在访问一个网站期间,所有的 Session 在任何一个地方都可以访问到。而 Cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 Cookie 互相是访问不到的。
5. 安全性:Cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session
6. 大小以及数量限制:每个域名所包含的 cookie 数:IE7/8,FireFox:50 个,Opera30 个; Cookie 总大小:Firefox 和 Safari 允许 cookie 多达 4097 个字节,Opera 允许 cookie 多达 4096 个字 节,InternetExplorer 允许 cookie 多达 4095 个字节;一般认为 Session 没有大小和数量限制。
关系:
Session 需要借助 Cookie 才能正常工作。如果客户端完全禁止 Cookie,Session 将失效!因为 Session 是由应用服务器维持的一个 服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的 SessionID, 用该 SessionID 为标识符来存取服务器端的 Session 存储空间。
而 SessionID 这一数据则是保存到客户端,用 Cookie 保存的,用户提交页面时,会将这一 SessionID 提交到服务器端,来存取 Session 数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用 Cookie,那么 Session 也会失效。
3. 如何修改 SESSION 的生存 时间
1、设置浏览器保存的 sessionid 失效时间 setcookie (session_name (), session_id (), time () + $lifeTime, "/");
2、可以使用 SESSION 自带的 session_set_cookie_params (86400); 来设置 Session 的生存期
3、通过修改 php.ini 中的 session.gc_maxlifetime 参数的值就可以改变 session 的生存时间
4. PHP 页面重定向的方法有哪些
5. PDO、adoDB、PHPLib 数据库抽象层比较
PHP 数据库抽象层就是指,封装了数据库底层操作的介于 PHP 逻辑程序代码和数据库之间的中间件。
PDO 以 PHP 5.1 为基础进行设计,它使用 C 语言做底层开发,设计沿承 PHP 的特点,以简洁易用为准,从严格意义上讲,PDO 应该归为 PHP 5 的 SPL 库之一,而不应该归于数据抽象层,因为其本身和 MySQL 和 MySQLi 扩展库的功能类似。PDO 是不适合用在打算或者有可能会变更数据库的系 统中的。
ADODB 不管后端数据库如何,存取数据库的方式都是一致的;
转移数据库平台时,程序代码也不必做太大的更动,事实上只需要改动数据库配置文 件。提供了大量的拼装方法,目的就是针对不同的数据库在抽象层的底层对这些语句进行针对性的翻译,以适应不同的数据库方言!
但是这个抽象层似乎体积过于庞 大了,全部文件大概有 500K 左右,如果你做一个很小的网站的话,用这个似乎大材小用了
PHPLib 可能是伴随 PHP 一同成长最老的数据库抽象层(但和 ADODB 相比,它只算是一个 MySQL 抽象类库),这个抽象类使用方法相当简单,体积小,是小型网站开发不错的选择。
PDO 提供预处理语句查询、错误异常处理、灵活取得查询结果(返回数组、字符串、对象、回调函数)、字符过滤防止 SQL ***、事务处理、存储过程。
ADODB 支持 缓存查询、移动记录集、(HTML、分页、选择菜单生成)、事务处理、输出到文件。
6. 长连接、短连接的区别和使用
长连接:client 方与 server 方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于 P2P 通信。
短连接:Client 方与 server 每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。C/S 通信。
长连接与短连接的使用时机:
长连接:
短连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况。每个 TCP 连 接的建立都需要三次握手,每个 TCP 连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作下次操作时直接发送数据 就可以了,不用再建立 TCP 连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成 socket 错误,频繁的 socket 创建也是对资源的浪 费。
短连接:
web 网站的 http 服务一般都用短连接。因为长连接对于服务器来说要耗费一定 的资源。像 web 网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个 连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。
7. HTTP 协议详解、应用
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、短连接、灵活、应用层的协议,常基于 TCP 的连接方式。
(HTTP 响应状态码)
HTTP 响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息 -- 表示请求已接收,继续处理
2xx:成功 -- 表示请求已被成功接收、理解、接受
3xx:重定向 -- 要完成请求必须进行更进一步的操作
4xx:客户端错误 -- 请求有语法错误或请求无法实现
5xx:服务器端错误 -- 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK // 客户端请求成功
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用 403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error // 服务器发生不可预期的错误
503 Server Unavailable // 服务器超时 // 可能恢复正常
304 Not Modifed // 自从上次请求后,请求的网页未修改过。
// 服务器返回此响应时,不会返回网页内容。
8. socket 连接步骤
Socket(套接字)概念
套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。
Socket 连接过程
建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一个运行于服务器端,称为 ServerSocket
套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端
套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
9. TCP 协议,三次握手、四次挥手
TCP 协议 (Transmission Control Protocol) 是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,四次挥手断开连接。
位码即 tcp 标志位,有 6 种标示:
SYN (synchronous 建立联机) 同步
ACK (acknowledgement 确认)
PSH (push 传送)
FIN (finish 结束)
RST (reset 重置)
URG (urgent 紧急)
10. posix 及 perl 兼容正则比较,及函数性能分析
POSIX 正则和 PCRE 正则最显著的需要知道的不同点:
1)、PCRE 函数需要模式以分隔符闭合.
2)、POSIX 兼容正则没有修正符。不像 POSIX, PCRE 扩展没有专门用于大小写不敏感匹配的函数。取而代之的是,支持使用 /i 模式修饰符完成同样的工作。其他模式修饰符同样可用于改变匹配策略.
3)、POSIX 函数从最左面开始寻找最长的匹配,但是 PCRE 在第一个合法匹配后停止。如果字符串 不匹
配这没有什么区别,但是如果匹配,两者在结果和速度上都会有差别。为了说明这个不同,考虑下面的例子 (来自 Jeffrey Friedl 的《精通正则表达式》一书). 使用模式 one (self)?(selfsufficient)? 在字符串 oneselfsufficient 上匹配,PCRE 会匹配到 oneself, 但是使用 POSIX, 结果将是整个字符串 oneselfsufficient. 两个子串都匹配原始字符串,但是 POSIX 将 最长的最为结果.
PCRE 可用的修饰符: (i,s,m)
11. 如何优化前端性能
1) 页面内容的优化
a) 降低请求数
合并 css、js 文件,集成 CSS 图片
b) 减少交互通信量
压缩技术:压缩 css、js 文件,优化图像,减少 cookie 体积;
合理利用缓存:使用外部 js/css 文件,缓存 ajax;
减少不必要的通信量:剔除无用脚本和样式、推迟加载内容、使用 GET 请求
c) 合理利用 “并行” 尽量避免重定向
慎用 Iframe 样式表置于顶部 脚本放到样式后面加载
d) 节约系统消耗
避免 CSS 表达式、滤镜
2) 服务器的优化
12. PHP 做好防盗链的基本思想 防盗链
什么是盗链?
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面 (如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
网站盗链会大量消耗被盗链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益。 如何做防盗链?
不定期更名文件或者目录
限制引用页
原理是,服务器获取用户提交信息的网站地址,然后和真正的服务端的地址相比较, 如果一致则表明是站内提交,或者为自己信任的站点提交,否则视为盗链。实现时可以使用 HTTP_REFERER1 和 htaccess 文件 (需要启用 mod_Rewrite),结合正则表达式去匹配用户的每一个访问请求。
文件伪装
文件伪装是目前用得最多的一种反盗链技术,一般会结合服务器端动态脚本 (PHP/JSP/ASP)。实际上用户请求的文件地址,只是一个经过伪装的脚本文件,这个脚本文件会对用户的请求作认证,一般会检查 Session,Cookie 或 HTTP_REFERER 作为判断是否为盗链的依据。而真实的文件实际隐藏在用户不能够访问的地方,只有用户通过验证以后才会返回给用户
加密认证
这种反盗链方式,先从客户端获取用户信息,然后根据这个信息和用户请求的文件名 字一起加密成字符串 (Session ID) 作为身份验证。只有当认证成功以后,服务端才会把用户需要的文件传送给客户。一般我们会把加密的 Session ID 作为 URL 参数的一部分传递给服务器,由于这个 Session ID 和用户的信息挂钩,所以别人就算是盗取了链接,该 Session ID 也无法通过身份认证,从而达到反盗链的目的。这种方式对于分布式盗链非常有效。
随机附加码
每次,在页面里生成一个附加码,并存在数据库里,和对应的图片相关,访问图片时和此附加码对比,相同则输出图片,否则输出 404 图片
加入水印
关注微信公众号 “PHP大神” 回复“面试题”可以获取更多php相关面试题 ,整理不易请多关注,如有错误请多包涵哈!