2018记一次面试PHP开发岗笔试题

面试杭州复杂美科技有限公司的PHP开发岗位。

以下是这家公司的PHP开发岗的笔试题,笔试题个人看来不是非常难,但是我做的不好。期望对大家有所帮助!!!

1.列举你使用过或者接触过的常用缓存技术。

 解:全页面静态化缓存、页面部分缓存、数据缓存、查询缓存、按内容变更进行缓存、内存式缓存、apache缓存模块、php APC缓存扩展、Opcode缓存。(参考链接php缓存技术总结


2.PHP中防Sql注入,防止Xss攻击常用的解决方案。

解:PHP中防Sql注入常用的解决方案:使用预处理语句和参数化的查询(参考链接PHP中如何防止SQL注入);

      防止Xss攻击常用的解决方案:1.直接过滤所有的JavaScript脚本;

                                                 2.系统的扩展函数库提供了XSS安全过滤的remove_xss方法;

                                                 3.转义Html元字符,使用htmlentities、htmlspecialchars等函数 


3.“贵公司尾号1111的账户2月23日17时15分电子汇入收入人民币1.27元,余额850.23元。对方户名:测试。[建设银行]

以上是一条银行入账短信,请使用正则解析出短信中 公司尾号 日期时间 入款数量 资金余额 以及 对方户名 短信来源银行信息


解:

公司尾号对应的正则表达式:'/[0-9]{4}/'

      日期时间:‘/\d{1,2}月\d{1,2}日\d{1,2}时\d{1,2}分/’

      入款数量:‘/收入人民币(\d{1}\.\d{1,2})/’

      资金余额: ‘/余额(\d{1,3}\.\d{1,2})/’

      对方户名:'/对方户名:([\u4e00-\u9fa5]+)/'

      短信来源银行信息:'/\[([\u4e00-\u9fa5]+)\]/'


注:正则表达式不是很擅长,有错误希望指正讨论。参考链接(php中正则表达式详解,在线正则表达式测试)。


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


     解:

      “在mySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。

      char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索         操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录       其长度的字节(即总长度为L+1字节)。

      char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使         用char类型。

      定长的char的优势: 
     一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占1个byte用于存储信息长          度,本来打算节约存储的现在得不偿失。

     二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而      且还要占1个长度信息。

     三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有      很多的精力用于计算,而这些对于char来说是不需要的。

    总的说来:char定长,存储效率不如varchar,对于短数据的查询优于varchar”

   参考链接(mysql中char与varchar的区别 哪种字段的查找效率高)



5.从表login中选出name字段包含admin的前10条结果所有信息的sql语句。

解:Select *from login where name like '%admin%' limit 0,10;


6.MySQL中Innodb引擎和MyIASM引擎两种引擎的区别。


解:

InnoDB引擎

InnoDB引擎提供了对数据库ACID事务的支持;
提供了行级锁和外键约束;
不支持FULLTEXT类型的索引(全文索引);
没有保存表的行数,因此当SELECT COUNT(*) FROM TABLE时需要扫描全表;

InnoDB要求表必须要有主键,如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键(这个字段长度为6个字节,类型为长整形)。

MyIASM引擎

不提供对数据库事务的支持,也不支持外键和行级锁;
使用表级锁,所以写操作需要锁定整个表;
支持FULLTEXT类型的索引(全文索引);
MyIASM中存储了表的行数,所以当SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描;

表不一定要有主键。

参考链接(InnoDB和MyIASM储存引擎的区别)


7.PHP5中魔术方法函数有哪几个?请举例说明各自的用法。

解:

魔术方法:

__construct() :实例化对象时被调用;

__destuct():当删除一个对象或者对象操作终止是被执行;

__call():调用对象不存在方法时被调用;

__get():调用对象不存在的属性时被调用;

__set():设置对象不存在的属性时被调用;

__toString():打印一个对象时被调用,比如echo $obj,print($obj);

__clone():克隆对象时被调用,比如$t = new Test();$tt = clone $t;

__sleep():serialize之前被调用,若对象比较大,想做一些删除在序列化,可以考虑使用该方法;

__wakeup():unserialize之前被调用,做些对象的初始化;

__isset():检测对象是否存在属性的时候被调用,如 isset($c->name);

__unset():unset一个对象属性时被调用,如:unset($c->name);

__set_state():调用var_export时被调用,用__set_state的返回值作为 var_export的返回值;

__autoload():实例化一个对象时,如果对应的类不存在,在该方法被调用。


魔术常量:

__LINE__:返回当前行号;

__FILE__:返回文件的完整路径和文件名,如果用在包含文件里面,则返回包含文件名,自 php4.0.2后,__FILE__总是包含一个绝对路径,而在此前的版本有时候会包含一个相对路径;

__FUNCTION__:返回函数名称(自 php4.3.0新加的)。自php5起本常量返回该函数被定义时的名称,区分大小写,在php4中该值总是小写;

__CLASS__:返回类的名称,自 php4.3.0新加的,自php5起本常量返回该类被定义时的名称,区分大小写,在php4中该值总是小写的;

__METHOD__:返回类的方法名。 php5新加的

参考链接(PHP5中魔术方法函数有哪几个,请举例说明各自的用法)


8.写一个函数,计算数组中最大数和最小数的差。

解: 这一题的前提应该是数值数组。否则要做很多前提判断。



9.求2个日期的差数,例如2017-01-01~2017-05-06的日期差数。

解:

function($str1,$str2){
  $temp = explode('-',$str1);
  $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
  $temp = explode('-', $str2);
  $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
  return  ($time2-$time1)/86400;
}


10.有一个网页地址,比如PHP开发资源主页:http://www.phpres.com/index.html,如何得到它的内容。

   


方法1(对于PHP5及更高版本):

   $readcontents = fopen("http://www.phpres.com/index.html", "rb");
   $contents = stream_get_contents($readcontents);
   fclose($readcontents);
   echo $contents;

方法2:

   echo file_get_contents("http://www.phpres.com/index.html");

11.实现一个函数,将字符串 “hello_world”转换成  "HelloWorld","hello_hang_zhou"转换成“HelloHangZhou”(注意:通用性)。

function strHandle($str){
  $result='';
  if(is_string($str)){
      $arr=explode('_',$str);
      foreach( $arr as $val){
       $result.=ucfirst($val);
   }
  }else{
     $result='请输入字符串';
 }
  return $result;
}

12.当前系统有个名称 33/look 的目录,请采用广度优先和深度优先2种方式遍历此文件夹。

注:可以参考二叉树的深度优先遍历和广度优先遍历。

深度优先遍历:
function scan_dir($dir) {
    $files = array();
    if(@$handle = opendir($dir)) { //注意这里要加一个@,不然会有warning错误提示:)
        while(($file = readdir($handle)) != = false) {
            if($file != ".." && $file != ".") { //排除根目录;
                if(is_dir($dir."/".$file)) { //如果是子文件夹,就进行递归
                    $files[$file] = scan_dir($dir."/".$file);
                } else { //不然就将文件的名字存入数组;
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
        return $files;
    }
}

广度优先遍历:

队列实现

      function breadth_first_dir($dir) {
         $files = array();
         $queue = array();
	 $parentDir=$dir;
	 array_unshift($queue,$dir);
	 while(!empty($queue)){
	    $handle = array_pop($queue);
	    if($handle!=$parentDir){
		   $handle=$parentDir."/".$handle;
		   $parentDir=$handle;
	     }
	   if(is_dir($handle)){
		  if(@$handle = opendir($handle)){
		    while($file = readdir($handle)) != = false){
		       if($file != ".." && $file != ".") {
			array_unshift($queue,$file);
		       }
		     } 
		   }
	     $files[]=$handle; 
	     closedir($handle);
	    }else{	   
		 $files[]=$handle; 	 
	     } 
	   }
        return $files;	  
       }

 
  



微信扫一扫

2018记一次面试PHP开发岗笔试题_第1张图片

你可能感兴趣的:(面试题)