32道PHP面试题(附答案)

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

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

二、session与cookie的区别是什么,请从协议、产生的缘由与做用说明?html

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

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

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

三、HTTP状态中30二、40三、500代码含义?算法

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

403:禁止访问数据库

500:服务器内部错误编程

401:表明未受权

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

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

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

因为varchar类型是可变的,因此在数据长度改变时,服务器要进行额外的操做,因此效率比char类型低。

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

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

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

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

六、isset()和empty()区别

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

七、请说明PHP中传值和传引用的区别。何时传值何时传引用?

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

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

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

八、在PHP中error_reporting这个函数有什么做用?

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

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

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

十、如今编程中常常采起MVC三层结构,请问MVC分别指哪三层,有什么优势?

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

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

十一、ajax的优点是什么?

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

十二、在程序开发中,如何提升程序的运行效率?

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

B、数据表中建立索引

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

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

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

B、使用负载均衡

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

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

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

F、反向代理

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

区别:

在失败的时候:

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

require在运行前载入

include在运行时载入

代替:

require_once、include_once

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

@表明全部warning忽略

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

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

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

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

1八、echo、print_r、print、var_dump区别

echo:语句结构

print:是函数,有返回值

print_r:能打印数组、对象

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

1九、写出smarty模板的特色

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

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

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

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

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

方法二:利用meta

echo "";

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

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

2二、若是须要原样输出用户输入的内容,在数据入库以前,要用哪一个函数处理?

htmlspecialchars或者htmlentities

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

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

讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站。若是A网站存在CSRF漏洞,此时B网站给A网站请求(此时至关因而用户访问),A网站认为是用户发的请求,从而B网站就成功假装了你的身份,所以叫跨站脚本攻击。

CSRF防范:

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

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

XSS:跨站脚本攻击

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

2四、安全对一套程序来讲相当重要,请说说在开发中应该注意哪些安全机制?

A、防远程提交

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

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

2五、对json数据格式的理解?

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

2六、什么是事务?及其特性?

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

事务特性:

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

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

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

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

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

2七、什么是锁?

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

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

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

2八、索引的做用?和它的优势缺点是什么?

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

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

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

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

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

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

定义:

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

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

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

做用:

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

外键:用来和其余表创建联系

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

个数:

主键:主键只能有一个

外键:一个表能够有多个外键

索引:一个表能够有多个惟一索引

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

private:私有成员,在类的内部在能够访问;

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

public:公共成员,彻底公开,没有访问限制;

3二、堆和栈的区别?

堆:是程序运行期间动态分配内存空间,你能够根据程序的运行状况肯定要分配的堆内存大小;

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