Php面试题整理

前言:

整合网上资源和自我面试过程中的面试题。毕竟不是大牛,基础也没有很牢固,所以特新建此篇文章并持续更新,以供以后刷题观看。

面试题:

Web类型题

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

12345原则。1.消息系列。2.成功系列。3.重定向系列。4.请求错误系列。5.服务器错误系列。
302:暂时性转移又称暂时重定向。403:禁止访问。500:服务器内部错误。

2. session与coookie的区别是什么,请从协议,产生的原因与作用说明。

区别:session是存储于服务器端,cookie是存储于客户端。session比较安全,cookie通过某些手段可以修改,不安全。session依赖于cookie进行传递。一般情况一个cookie保存的数据大小不超过4k,而session是占用服务器内容,原则上讲可以无限大。
产生原因和作用:http是无状态协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,在次交换数据需要重新建立连接。这就意味着服务器无法从连接上跟踪会话。于是产生出cookie实现跟踪。

3. 表单提交中的Get和Post的异同点

get 请求一般用于向服务端获取数据,post 一般向服务端提交数据。
get 传输的参数在 url 中,传递参数大小有限制,post是隐式提交,没有大小限制。
get 不安全,post 安全性比get高。
get请求在服务端用Request.queryString 接收 ,post 请求在服务端用Requset.form 接收。

4. 如何在页面之间传递变量 ?

get,post,cookie,session,隐藏表单。

5. 对于大流量的网站,你会采用什么方法来解决访问量?

首先确认服务器硬件是否满足支持当前的流量。
优化数据库的访问。
禁止外部盗链。
控制大文件下载。
使用不同的主机分流。
使用流量分析统计工具。

Php类型题

1. Php是什么意思

PHP是PHP的递归首字母缩写:Hypertext Preprocessor,一种用于创建动态和交互式HTML网页的脚本语言。当网站访问者打开页面时,服务器处理PHP命令,然后将结果发送到访问者的浏览器。

2. 什么是面向对象?主要特征是什么?

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

封装:

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.

继承:

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。

多态:

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

抽象:

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。

3. 不使用cookie向客户端发送一个cookie.

session_start()开启时,会生成SID常量,当cookie开启时,这个常量为空,当cookie关闭时,会存储PHPSISSID的值。可以在通过在url后增加一个SID参数进行传递SESSIONID的值,从而可以使客户端页面可以使用session里面的值。当客户端开启cookie和服务器端开启session时。浏览器第一次请求,服务器会向浏览器端发送一个cookie里面存储SESSIONID,当浏览器第二次请求时会把已存在的cookie一起提交到服务器端。

4. cookie的设置及获取

设置cookie的值:siecookie(名称,值,保存时间,有效域)
获取cookie的值:$_COOKIE[‘名称’]

5. isset() 和 empty() 区别

isset判断变量是否存在,可传入多个变量,若其中有一个变量不存在则返回false。empty判断变量是否为空,只可传入一个变量,如果为空则返回true。

6. include与require的区别

首先include和require都是引入指定的文件。_once表示只引入一次,即之前已经引入过的不再引入。
include()在执行文件时每次都要加载进行读取和评估,require()文件只加载处理一次。
include在引入不存文件时产生一个警告且脚本还会继续执行,require则会导致一个致命性错误且脚本停止执行。
include()是有条件包含函数,而 require()则是无条件包含函数。
include有返回值,而require没有。

7. Php单引号与双引号的区别

单引号不能解释变量,双引号中可以解释变量。
单引号中不能转义大多数字符,双引号中可以转义所有字符。
(双引号中的单引号可以解释变量和转义字符)

8. 请说明Php中传值和传引用的区别,什么时候传值什么时候传引用

传值:函数范围内对值得任何改变都会在函数外被忽略。
传引用:函数范围内对值得任何改变都会影响到函数外得值。
按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。

9. echo(),print(),print_r()的区别?

echo是php语句,print和print_r是函数,语句没有返回值,函数有返回值。
print只能打印简单的数据类型,print_r可以打印复杂的数据类型,echo可以输出一个或多个字符串。

10. 面向对象中接口与抽象类的区别

抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。

接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。

区别:

抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。

抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。

抽象类中可以有构造方法,但是接口没有构造方法。

抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。

一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。

抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。

9. 请写出常见的排序算法

常见排序算法:冒泡,快速,简单选择,堆,直接插入,希尔,合并。

10. 能够使Php和html分开使用的模板

Smarty,template,phplibtemplate,Fasttenplate。

11. 有那些版本控制工具

Clear case,cvs,svn,git,rcs,ccc,pvcs。

12. 中文截取无乱码

mb_substr()

13. 获取客户端和服务端的ip

客户端:$_SERVER[‘REMOTE_ADDR’]
服务端:$_SERVER[‘SERVER_ADDR’]

14. 简述 private、 protected、 public修饰符的访问权限。

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

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

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

15. 堆和栈的区别?

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

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

16. 什么是构造函数,什么是析构函数,作用是什么?

构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。

析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。

17. 如何重载父类的方法,举例说明

重载,即覆盖父类的方法,也就是使用子类中的方法替换从父类中继承的方法,也叫方法的重写。

覆盖父类方法的关键是在子类中创建于父类中相同的方法包括方法的名称、参数和返回值类型。PHP中只要求方法的名称相同即可。

18. 常用的魔术方法有哪些?举例说明

php规定以两个下划线()开头的方法都保留为魔术方法,所以建议大家函数名最好不用开头,除非是为了重载已有的魔术方法。

__construct() 实例化类时自动调用。

__destruct() 类对象使用结束时自动调用。

__set() 在给未定义的属性赋值的时候调用。

__get() 调用未定义的属性时候调用。

__isset() 使用isset()或empty()函数时候会调用。

__unset() 使用unset()时候会调用。

__sleep() 使用serialize序列化时候调用。

__wakeup() 使用unserialize反序列化的时候调用。

__call() 调用一个不存在的方法的时候调用。

__callStatic()调用一个不存在的静态方法是调用。

__toString() 把对象转换成字符串的时候会调用。比如 echo。

__invoke() 当尝试把对象当方法调用时调用。

__set_state() 当使用var_export()函数时候调用。接受一个数组参数。

__clone() 当使用clone复制一个对象时候调用。

19. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用?

$this 当前对象

self 当前类

parent 当前类的父类

$this在当前类中使用,使用->调用属性和方法。

self也在当前类中使用,不过需要使用::调用。

parent在类中使用。

20. 类中如何定义常量、如何类中调用常量、如何在类外调用常量。

类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。

定义常量使用关键字const.

例如:const PI = 3.1415326;

无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,

访问常量的格式都是类名加作用域操作符号(双冒号)来调用。

即:类名 :: 类常量名;

MySQL类型题

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

int:整数。char:定长字符。varchar:变长字符。datetime:时间日期。text:文本。
varchar与char的区别:char是固定长度的字符串,分配多少空间就会占用多少空间。varchar是可以变长度的字符串,内容又多大就占用多大空间,能有效节省空间。由于varchar类型是可变的,所以在数据长度进行改变时,服务器要进行额外的操作,所以效率回避char低。

2. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?

myisam类型不支持事务,表锁,容易产生碎片,要经常优化,读写速度快,innodb支持事务,行锁,有崩溃修复能力。读写速度慢。
创建索引语句:alert table 表名 add index(‘字段名称’) ;

3. mysql_fetch_row()和mysql_fetch_array()的区别

mysql_fetch_row()以索引数组的方式取查询结果集,mysql_fetch_array()以索引数组和关联数组两种方式取查询结果集。

4. sql语句应该考虑哪些安全性

防止sql注入,对特殊字符进行转义,过滤或者使用预编译sql语句绑定。
使用最小权限原则,特别注意不要使用root用户权限,为不同操作建立不同权限的用户。
当sql报错时,不要返回客户端,可写入log中查看。

5. 优化mysql 数据库方法

选择适当的字段类型,尽量把字段设置为NOTNULL。
使用连接(JOIN)来代替子查询(Sub-Queries)。
使用联合(UNION)查询代替手动创建临时表。
尽量减少使用(LIKE)关键字和通配符。
使用事务和外健。

6. 什么是数据库索引,主键索引和唯一索引的区别,索引的缺点是什么

索引是快速寻找那些有特定值的记录。
主键索引和唯一索引的区别:主键是一种唯一性索引,但他必须指定为PRIMARY KEY,并且每个表中只能有一个主键。唯一索引的所有值都只能出现一次,即必须唯一。
索引的缺点:
    创建索引和维护索引需要耗费时间,这种时间随着数据量的增加而增加。
    索引需要占用物理空间,除了数据表占据数据空间之外,每个索引还要占据一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。
    当对表中的数据进行增删改的时候,索引也需动态维护,这样就降低了数据的维护速度。

7. 数据库中的事务是什么

事务是作为一个单元的一组有序的数据操作,具有原子性,一致性,隔离性,持久性。如果组中的操作都成功,则认为事务成功,即只有一个操作失败,则认定为事务操作失败。如果事务所有操作完成,事务提交,其修改将作用于所有其他数据库进程。如果有一个操作失败,事务将回滚,该事务所有操作的影响都会被取消。

8. 解释左连接,右连接,内连接,全连接

内连接仅选出两张表中相互匹配的数据记录,因此会导致有时我们需要的记录没有被包含进来。内连接是两个表中都必须有连接字段对应值的记录,数据才能被检索出来。
左连接和右连接都是外部连接,也就是区别于内连接,它对不满足连接条件的行并不是像内连接一样将数据完全过滤掉,而是保留一部分数据,数据行数不会减少。
左连接是只要左边表中有记录,数据就能被检索出来,而右边有的记录必须在左边表中有记录才会被检索出来,右连接则相反。
全连接则会返回两个表中所有的数据记录。

9. MySQL有哪些存储引擎

myisam,innodb,bdb,merge,memory,csv,maxdb。

10. 什么是锁?

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

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

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

11. 什么叫视图?游标是什么?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

12. 什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

13. 如何通俗地理解三个范式?

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

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

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

14. 说说对SQL语句优化有哪些方法?

Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

用EXISTS替代IN、用NOT EXISTS替代NOT IN。

避免在索引列上使用计算

避免在索引列上使用IS NULL和IS NOT NULL

对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

14. SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?

非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。

因此非相关子查询比相关子查询效率高