面试杭州复杂美科技有限公司的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事务的支持;InnoDB要求表必须要有主键,如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键(这个字段长度为6个字节,类型为长整形)。
MyIASM引擎
不提供对数据库事务的支持,也不支持外键和行级锁;表不一定要有主键。
参考链接(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;
}
微信扫一扫