32道PHP面试题(附答案)

1、什么是面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

2、session与cookie的区别是什么,请从协议、产生的原因与作用说明?

A、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。

B、session存储在服务器端,cookie保存在客户端。session比较安全,cookie用某种手段可以修改,不安全。session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。session保存在服务器的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。session文件时公有的。

3、HTTP状态中302、403、500代码含义?

302:临时转移成功,请求的内容已转移到新位置

403:禁止访问

500:服务器内部错误

401:代表未授权

4、请写出数据类型(int char varchar datetime text)的意思;请问varchar和char有什么区别?

int:整数 char:定长字符 varchar:变长字符 datetime:日期时间 text:文本型

varchar和char区别:char是固定长度的字符类型,分配多少空间,就占用多长空间。varchar是可变长的字符类型,内容有多大就占用多大的空间。

由于varchar类型是可变的,所以在数据长度改变时,服务器要进行额外的操作,所以效率比char类型低。

5、myisam和innodb的基本区别?索引结构如何实现?

A、myisam类型不支持事务,表锁,易产生碎片,要经常优化,读写书读快,适合用于频繁查询的应用。

B、innodb类型支持事务,行锁,有崩溃回复能力,读写速度比myisam慢,适合于插入和更新操作比较多的应用,空间占用大,不支持全文索引。

创建索引:alert table tanlename add index 索引名 (`字段名`)

6、isset()和empty()区别

isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假;empty判断变量是否为空为假,只可传入一个变量,如果为空位假则返回真。

7、请说明PHP中传值和传引用的区别。什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外都会被会忽略。

按引用传递:函数范围内对值的任何改变在函数外也能反映出这些修改。

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递不需要复制值,对于性能提高很有好处。

8、在PHP中error_reporting这个函数有什么作用?

设置PHP的报错级别并返回当前级别。

9、说说你对缓存技术的了解?

缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。

10、现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?

MVC三层分别指:业务模型、视图、控制区。由控制器调用模型处理数据,然后将数据映射到视图层进行显示。

优点:a、可以实现代码的重用性,避免产生代码冗余;b、M和V实现代码分离,从而使同一个程序可以使用不同的表现形式。

11、ajax的优势是什么?

ajax是异步传输技术,可以通过javascript实现,也可以通过jquery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。

12、在程序开发中,如何提高程序的运行效率?

A、优化sql语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询语句可用连接替代;少用模糊查询

B、数据表中创建索引

C、对程序中经常用到的数据生成缓存

13、对于大流量的网站,您采用什么样的方法来解决访问量问题?

A、有效使用缓存,增加缓存命中率

B、使用负载均衡

C、对静态文件使用cdn进行存储和加速

D、想法减少数据库的使用

E、查看出现统计的瓶颈在哪里

F、反向代理

14、语句include和require的区别是什么?为避免多次包含同一个文件,可用什么语句替代它们?

区别:

在失败的时候:

include产生一个warning,而require产生直接错误终端

require在运行前载入

include在运行时载入

代替:

require_once、include_once

15、foo()和@foo()之间有什么区别?

@代表所有warning忽略

16、简述PHP的垃圾收集机制。

php中变量存储在变量容器zval中,zval中除了存储了变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就会回收变量容器。如果一个zval的refcount减1之后大于0,他就会进入垃圾缓存区,当缓存区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。

17、如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)。

18、echo、print_r、print、var_dump区别

echo:语句结构

print:是函数,有返回值

print_r:能打印数组、对象

var_dump:能打印对象数组,并且带数据类型

19、写出smarty模板的特点

速度快、编译型、缓存技术、插件机制、强大的表现逻辑

20、PHP如何实现页面跳转?

方法一:php函数跳转,缺点:header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。

header("location:网址");//直接跳转

header("refresh:3;url=网址");//三秒后跳转

方法二:利用meta

echo "";

21、如何把一个gb2312格式的字符串转换成utf-8格式?

iconv("GB2312","UTF-8","字符串内容")

22、如果需要原样输出用户输入的内容,在数据入库之前,要用哪个函数处理?

htmlspecialchars或者htmlentities

23、什么是CSRF攻击?XSS攻击?如何防范?

CSRF:跨站请求伪造,攻击方伪装成用户身份发送请求从而窃取信息或者破坏系统。

讲述基本原理:用户访问A网站登录并生成了cookie,再访问B网站。如果A网站存在CSRF漏洞,此时B网站给A网站请求(此时相当于是用户访问),A网站认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。

CSRF防范:

A、合理规范api请求方式GET,POST

B、对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务器进行验证随机码是否相同

XSS:跨站脚本攻击

防范:不相信任何输入,过滤输入

24、安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?

A、防远程提交

B、防止SQL注入,对特殊代码进行过滤

C、防止注册灌水,使用验证码

25、对json数据格式的理解?

json是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递。

26、什么是事务?及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

A、原子性:即不可分割性,事务要么全部执行,要么就全部不执行。

B、一致性:事务的执行使得数据库从一种状态转换成另一种状态。

C、隔离性:在事务提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。

D、持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

或者这样理解:事务就是被绑定在一起作为一个逻辑工作单元的sql语句组,如果任何一个语句操作失败,那么整个操作就被失败,以后操作就会回滚到操作之前状态,或者是放个节点。未了确保要么执行,要么不执行,就可以使用事务。

27、什么是锁?

数据库是一个多用户使用的共享资源。当多个用户并发取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据队形有一定的控制,在该事务释放锁之前,其他的事务不能对此数据队形进行更新操作。

基本锁类型:锁包括行级锁和表级锁

28、索引的作用?和它的优点缺点是什么?

索引就是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询证书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者多个列。缺点是它减慢了数据录入的菽粟,同时也增加了数据库的尺寸大小。

29、如何通俗地理解三个范式?

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性;

第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余;

30、主键、外键和索引的区别?

定义:

主键:唯一标识一条记录,不能有重复的,不允许为空;

外键:表的外键是另一张表的主键,外键可以有重复的,可以是空值;

索引:该字段没有重复值,单可以有一个空值;

作用:

主键:用来保证数据完整性

外键:用来和其他表建立联系

索引:是提高查询排序的速度

个数:

主键:主键只能有一个

外键:一个表可以有多个外键

索引:一个表可以有多个唯一索引

31、简述private、protected、public修饰符的访问权限

private:私有成员,在类的内部在可以访问;

protected:保护成员,该类的内部和继承类中可以访问;

public:公共成员,完全公开,没有访问限制;

32、堆和栈的区别?

堆:是程序运行期间动态分配内存空间,你可以根据程序的运行情况确定要分配的堆内存大小;

栈:是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

原文地址:https://www.cnblogs.com/zhouguowei/p/5035125.html