武汉PHP,面试必考经典36题(含答案)

武汉的PHP业界,稍微好点的公司,基本都是三轮面试。

第一轮,做面试题。如果题目做的还不错,会有第二轮,由公司的PHP研发人员来提问。第二轮表现依然不错,第三轮就会有HR来和你谈薪资了。这里是武汉PHP培训-长乐未央教育整理的一些,武汉PHP面试必考题。

武汉PHP必考面试题目

一般来说是不能的,session依赖于cookie。但也有一些特殊的处理方法,例如通过get传递session id。

2、简述POST 和GET的区别?

我们再网页上填写的表单信息都可以通过这两个方法将数据传递到服务器上,当我们使用GET方法是,所有的信息都会出现在URL地址中,并且使用GET方法最多只能传递1024个字符,所以如果在传输量小或者安全性不那么重要的情况下可以使用GET方法。说到POST方法,最多可以传输2MB字节的数

3、如果不登录实现购物车?

登录前,将购物车商品信息,存入cookie。多个商品,可以使用serialize序列化后再存入。
当用户登录后,将cookie中的信息,写入数据库,清空cookie。这样用户下次访问,购物车的信息不会丢失。

4、如果有库存系统,下单后,减少库存,并生成订单,正确的处理方式是怎样的?

使用数据库事务来处理。如果并发量大,还需要加锁和队列。

5、数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。
如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

6、常见的文件处理函数有哪些?

函数名 意义
fopen($fileName, ‘w’) 打开一个文件
fwrite 写入文件
fread 读取文件
fclose 关闭句柄
feof 判断是否到文件结尾
file_put_contents 一次将所有数据写入到指定的文件中
file_get_contents 读取文件的内容
copy 复制
unlink 删除
rename 重命名
ftruncate 文件截取

7、常见的网络状态码有哪些?分别是什么意思?

200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。   新的永久性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。
404 请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。   注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。

8、简述MVC的原理与好处?

MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。
Model:数据信息存取层。
View:view层负责将应用的数据以特定的方式展现在界面上。
Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

9、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号

function getLeader($n,$m) {  
    $res=0;  
    for($i=2; $i<=$n; $i++) {
        $res=($res+$m)%$i;  
    }
    return $res+1;  
}  
$leader = getLeader(13,34);
echo $leader;

//方法2,定义函数
function getKing($monkeys , $m , $current = 0){
    $number = count($monkeys);
    $num = 1;
    if(count($monkeys) == 1){
        echo '<font color="red">编号为'.$monkeys[0].'的猴子成为猴王了!</font>';
        return;
    }else{
        while($num++ < $m){
            $current++ ;
            $current = $current%$number;
        }
        echo "编号为".$monkeys[$current]."的猴子被踢掉了...<br/>";
        array_splice($monkeys , $current , 1);
        getKing($monkeys , $m , $current);
    }
}
$n=13;      //总共猴子数目
$m = 34;    //数到第几只的那只猴子被踢出去
$monkeys = range(1,$n); //将猴子编号放入数组中
getKing($monkeys , $m);     //调用函数

10、PHP的数据类型有哪些?(英文)

布尔型(boolean)
字符串型(string)
整型(integer)
浮点型(float)
数组(array)
对象(object)
资源(resource)
空值(null)

11、用PHP打印出前一天的时间,格式是2006-5-10 22:21:21

echo date('Y-m-d H:i:s', strtotime('-1 days'));

12、PHP有哪些输出函数?

echo
print
print_r
var_dump

echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
print() 只能打印出简单类型变量的值(如int,string)
print_r() 可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
var_dump 输出时,同时输出数据类型

13、如何实现字符串翻转?

echo strrev($a);

//自己写函数
strrev($str)
{
    $len=strlen($str);
    $newstr = '';
    for($i=$len;$i>=0;$i--)
    {
        $newstr .= $str{$i};
    }
    return $newstr;
}

14、优化MYSQL数据库的方法

(1)选择最有效率的表名顺序
(2)WHERE子句中的连接顺序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替换HAVING子句
(5)通过内部函数提高SQL效率
(6)避免在索引列上使用计算。
(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

(1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
(2).使用连接(JOIN)来代替子查询(Sub-Queries)
(3).使用联合(UNION)来代替手动创建的临时表
(4).尽量少使用 LIKE 关键字和通配符
(5).使用事务和外键

15、您是否用过版本控制软件? 如果有您用的版本控制软件的名字是

svn
git/github

16、您是否用过模板引擎? 如果有您用的模板引擎的名字是?

smarty
thinkphp template
blade

17、你会使用哪些PHP框架?

thinkphp、laravel等

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

  1. 确认服务器硬件是否足够支持当前的流量
  2. 数据库读写分离
  3. 优化数据表,
  4. 程序功能规则
  5. 禁止外部的盗链
  6. 控制大文件的下载
  7. 使用不同主机分流主要流量

19、语句include和require的区别是什么?为避免多次包含同一文件

包含文件不存在或者语法错误的时候require是致命的,include是警告错误。使用require_once,或include_once;

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

@foo()控制错误输出

21、请写出php的构造函数和析构函数

__construct , __destruct

22、请写出PHP5权限控制修饰符

public private protected

23、简述面向对象三大特性

继承
封装
多态

24、写一个函数,算出两个文件的相对路径

  如 $a = ‘/a/b/c/d/e.php’;
  $b = ‘/a/b/12/34/c.php’;
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上

function getRelativePath($a, $b) {   
    $returnPath = array(dirname($b));   
    $arrA = explode('/', $a);   
    $arrB = explode('/', $returnPath[0]);   
    for ($n = 1, $len = count($arrB); $n < $len; $n++) {   
        if ($arrA[$n] != $arrB[$n]) {   
            break;   
        }    
    }   
    if ($len - $n > 0) {   
        $returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));   
    }   

    $returnPath = array_merge($returnPath, array_slice($arrA, $n));   
    return implode('/', $returnPath);   
   }   
   echo getRelativePath($a, $b);

25、简述两种屏蔽php程序的notice警告的方法

初始化变量,文件开始设置错误级别或者修改php.ini 设置error_reporting
set_error_handler 和 @抑制错误

1.在程序中添加:error_reporting (E_ALL & ~E_NOTICE);
2.或者修改php.ini中的:error_reporting = E_ALL
改为:error_reporting = E_ALL & ~E_NOTICE
3.error_reporting(0);或者修改php.inidisplay_errors=Off

26、instanceof的作用, 经常在什么设计模式中使用

单例模式,但是其他的模式也会用到

27、中文字串截取无乱码的方法

mb_substr()

28、MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?

varchat 长度不固定
char 长度固定 速度快

29、使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?

Memcahce是把所有的数据保存在内存当中,采用hash表的方式,每条数据又key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。

30、不用新变量直接交换现有两个变量的值

(1)list($a,$b)=array($b,$a);
(2)a=a+b,b=a-b,a=a-b

31、PHP支持多继承吗?

不支持。PHP中只允许单继承,父类可以被一个子类用关键字“extends”继承。

32、建立索引

(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([…],INDEX索引名)
(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([…],UNIQUE索引名)
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([…],PRIMARY KEY[索引字段])

33、有三个杯子容积如下:A:80L B:50L C:30L

现在将A杯注满水,要达到如下状态(a:40 b:40 c:0)

34、PHP实现四种常用的排序算法

插入排序(Insertion Sort),选择排序(Selection Sort),冒泡排序和快速排序是我们经常会用到的排序算法。下面是这几种算法的基本思想和相对应的PHP实现代码。
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

//插入排序(一维数组)
function insert_sort($arr){
    $count = count($arr);
    for($i=1; $i<$count; $i++){
        $tmp = $arr[$i];
        $j = $i - 1;
        while($arr[$j] > $tmp){
            $arr[$j+1] = $arr[$j];
            $arr[$j] = $tmp;
            $j--;
         }
     }
    return $arr;
}

选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

//选择排序(一维数组)
function select_sort($arr){
    $count = count($arr);
    for($i=0; $i<$count; $i++){
        $k = $i;
        for($j=$i+1; $j<$count; $j++){
            if ($arr[$k] > $arr[$j])
                $k = $j;
            if ($k != $i){
                $tmp = $arr[$i];
                $arr[$i] = $arr[$k];
                $arr[$k] = $tmp;
             }
         }
     }
    return $arr;
}

冒泡排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

//冒泡排序(一维数组)
function bubble_sort($array){
    $count = count($array);
    if ($count <= 0) return false;
    for($i=0; $i<$count; $i++){
        for($j=$count-1; $j>$i; $j--){
            if ($array[$j] < $array[$j-1]){
                $tmp = $array[$j];
                $array[$j] = $array[$j-1];
                $array[$j-1] = $tmp;
             }
         }
     }
    return $array;
}

快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

//快速排序(一维数组)
function quick_sort($array){
  if (count($array) <= 1) return $array;
  $key = $array[0];
  $left_arr = array();
  $right_arr = array();
  for ($i=1; $i<count($array); $i++){
    if ($array[$i] <= $key)
      $left_arr[] = $array[$i];
    else
      $right_arr[] = $array[$i];
  }
  $left_arr = quick_sort($left_arr);
  $right_arr = quick_sort($right_arr);
  return array_merge($left_arr, array($key), $right_arr);
}

35、PHP 数组排序

sort() - 以升序对数组排序
rsort() - 以降序对数组排序
asort() - 根据值,以升序对关联数组进行排序
ksort() - 根据键,以升序对关联数组进行排序
arsort() - 根据值,以降序对关联数组进行排序
krsort() - 根据键,以降序对关联数组进行排序

36、Memcache与Redis的区别

Memcache:
Memcache可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS,适用于最大程度扛量
只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失

Redis:
支持多种数据结构,如string,list,dict,set,zset,hyperloglog
单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。