某知名社交软件公司PHP工程师面试笔试真题2_第1页
某知名社交软件公司PHP工程师面试笔试真题2_第2页
某知名社交软件公司PHP工程师面试笔试真题2_第3页
某知名社交软件公司PHP工程师面试笔试真题2_第4页
某知名社交软件公司PHP工程师面试笔试真题2_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

某知名社交软件公司PHP工程师面试笔试真题2一、选择题1.

在PHP中,单引号和双引号所包围的字符串的区别是______A.单引号解析其中\r\t等转义字符,而双引号不解析B.双引号速度快,单引号速度(江南博哥)慢C.单引号速度快,双引号速度慢D.双引号解析其中以$开头的变量,而单引号不解析正确答案:D[解析]双引号可以解析$符号开头的变量和转义字符,而单引号不解析也不转义字符。选项A错误,选项D正确。

对于选项B和选项C,由于题目中明确说了引号内包含的是字符串,因此不需要对变量进行解析,所以在这种情况下双引号和单引号的效率是相同的。选项B和选项C都是错误的。

所以,本题的答案为D。

2.

在PHP中,白定义一个类的方式是______A.<?phpdefaultclassClass_Name(){//......}?>B.<?phpclassClass_Name{//......}?>C.<?phppublicfunctionClass_Name(){//......}?>D.<?phpfunctionClass_Name{//......}?>正确答案:B[解析]定义一个类是使用class关键字加类名,定义格式为class类名{}。实例化一个类的格式为$object=new类名();。

所以,本题的答案为B。

3.

下面可以用于服务器共享session的方式有______A.利用NFS共享Session数据B.基于数据库的Session共享C.基于Cookie的Session共享D.使用类似BIG-IP的负载设备来实现资源共享正确答案:ABCD[解析]共享Session的方式主要有以下几种:

1)基于NFS的Session共享。NFS(NetworkFileSystem)最早由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其他服务器的本地Session目录即可。

2)基于数据库的Session共享。

3)基于Cookie的Session共享。它的原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如.),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session在多服务间的共享访问。

4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的Key+Valtle数据存储模式使得代码小巧且高效,因此在并发处理能力上占据了绝对优势。

所以,本题的答案为ABCD。

4.

下列关于HTTP协议的说法中,错误的是______A.如果本地开启了Cookie,那么每打开一个网址,HTTP请求就会把相应的Cookie传给Web服务器B.HTTP响应的状态码为301,意思是暂时地把内容转移到一个新的URL,但是老的URL还没有废除C.HTTP是一个基于请求与响应模式的、无状态的、应用层的协议,绝大多数的Web开发都是基于HTTP协议D.绝大多数的Web开发离不开Cookie,如果禁用Cookie导致Session失效,那么可以通过URL来传递SessionID正确答案:B[解析]301表示请求的网页已被永久移动到新位置而不是暂时转移内容到新的URL。选项B说法错误。

所以,本题的答案为B。

5.

有如下代码,程序的输出结果为______

<?php

classA{

publicstatic$num=0;

publicfunction__construct(){

self::$num++;

}

}

newA();

newA();

newA();

echoA::$num;

?>A.0B.1C.2D.3正确答案:D[解析]本题中,当实例化类A时,只会触发__construct()的语句,而不触发publicstatic$num=0。同时,由于$num是static类型的值,newA()实例化了3次,$num的值会被执行++操作3次,$num的值为3,选项D正确。

所以,本题的答案为D。

6.

以下程序的运行结果为______

<?php

$str="LAMP";

$str1="LAMPBrother";

$strc=strcmp($str;$str1);

switch($strc){

case1:

echo"str>str1";

break;

case-'7':

echo"str<str1";

break;

case():

echo"str=str1";

break;

default:

echo"str<>str1";

}

?>A.str>str1B.str<str1C.str=str1D.str<>str1正确答案:B[解析]strcmp($str1,$str2)函数的功能是比较两个字符串的大小,如果$str1==$str2,则返回0;如果$str1>$str2,则返回值大于0,具体值为1乘上两个字符串相比不相同的字符个数;如果$str1<$str2,则返回值小于0,具体值为-1乘上两个字符串相比不相同的字符个数。

本题中,$str="LAMP",$str1="LAMPBrother",两个字符串不相同的字符有7个,且$str<$str2,所以,返回值为负数,即(-1*7)=-7。在switch语句的各类case语句中,匹配到“-7”,选项B正确。

所以,本题的答案为B。

7.

以下代码的输出是______

$somevar=15;

functionaddit(){

GLOBAL$somevar;

$somevar++;

echo"somevaris$somevar";

}

addit();A.somevaris15B.somevaris16C.somevaris1D.somevaris$somevar正确答案:B[解析]在函数体内通过GLOBAL引用了全局变量somevar,它的初始值为15,当执行自增操作后结果变为16,而使用双引号会把引号内的变量替换为它的值,因此输出为somevaris16。

所以,本题的答案为B。

8.

PHPsession扩展默认将session数据存储在______A.SQLiteDatabaseB.MySQLDatabaseC.SharedMemoryD.FileSystemE.SessionServer正确答案:D[解析]默认情况下,php.ini中设置的Session保存方式是files,Session文件保存的目录由session.save_path指定,文件的前缀为sess_,后跟SessionID,例如sess_c62665af28a8b19c0fe11afe3b59b41b。文件中的数据即是序列化之后的Session数据。当访问量大的时候,产生的Session文件会比较多,在这种情况下,可以设置分级目录对Session文件进行保存,从而提高性能,设置方法为session.save_path="N;/save_path",其中,N为分级的级数,save_path为开始目录。

所以,本题的答案为D。

9.

下列有关获取上传文件信息的预定义数据变量的写法正确的是______A.$FILESB._FILESC.__FILESD.$_FILES正确答案:D[解析]$_FILES超级全局变量是预定义超级全局数组中唯一的二维数组。其作用是存储各种与上传文件有关的信息,这些信息对于通过PHP脚本上传到服务器的文件至关重要。

此函数中总共有5项,见下表。函数说明$_FILES["userfile"]["error"]$_FILES["userfile"]["error"]数组值提供了与上传尝试结果有关的重要信息。总共有5个不同的返回值,其中1个表示成功的结果,另外4个表示在尝试中出现的特殊错误$_FILES["userfile"]["name"]$_FILES["userfile"]["name"]变量指定客户端机器上声明的文件的最初名字,包括扩展名。因此,如果浏览器一个名为vacation.jpg的文件,并通过表单上传,则此变量的值将是vacation.jpg$_FILES["userfile"]["size"]$_FILES["userfile"]["size"]变量指定从客户端上传的文件的大小,以字节为单位。因此,在vacation.jpg文件的例子中,此函数可能赋值为5253,大约为5KB$_FILES["userfile"]["tmp_name"]$_FILES["userfile"]["tmp_name"]变量指定上传到服务器后为文件赋予的临时名。这是存储在临时目录(由PHP指令upload_tmp_dir指定)中时所指定的文件名$_FILES["userfile"]["type"]$_FILES["userfile"]["type"]变量指定从客户端上传的文件的mime类型。因此,在vacation.jpg文件的例子中,此变量会赋值为image/jpeg。如果上传的是PDF,则赋值为application/pdf。因为这个变量有时会得到意外的结果,所以应在脚本中显示地进行验证

所以,本题的答案为D。

10.

对于MySQL的事务处理,下面说法错误的是______A.如果某表引擎是MyISAM,则无法使用事务处理B.执行starttransaction;可以开启事务C.开启事务后可以执行多条SQL操作,在没有commit之前,所做操作并未实际生效D.如果执行了commit后再执行rollback,则所做操作都会被取消正确答案:D[解析]对于选项A,MySQL的存储引擎MyISAM和MEMORY都是不支持事务的,只有InnoDB是支持事务的。选项A的说法是正确的。

对于选项D,当所有事务执行成功并且commit后所做的全部操作实际生效,就不能够再通过rollback撤销前面的所有操作了。选项D的说法错误。

所以,本题的答案为D。

二、填空题1.

getdate()函数返回的是______。正确答案:一个数组。[解析]getdate()函数返回指定时间的时间戳或当前时间的时间格式,它返回的是一个数组。该数组中包含的内容有秒、分、小时、一个月中的第几天、一周中的某一天、月、年、一年中的某一天、星期几的名称、月份的名称、自Unix纪元以来经过的秒数等。

2.

程序echostrtotime("November11,1952");在Windows系统上输出的是______。正确答案:-540892800。[解析]strtotime()是将时间转换成时间戳,但是时间戳是以1970年1月1日00:00:00时间点开始进行计算的,而题目中的代码是将1952年11月11日转换成时间戳,但该时间点并不在时间戳范围内,不能转换成时间戳,所以结果输出为-540892800。

3.

有一个数组,里面有重复的元素,使用______函数可以打印出不重复的元素。正确答案:array_unique()[解析]可以使用array_unique()函数打印出不重复的元素,array_unique()数的作用是移除数组中重复的值,并返回数组结果。

实现代码如下:

<?php

$arr=array(1,2,3,2,4,2,3,1);

print_r(array_unique($arr));

?>

程序的运行结果为Array([0]=>1[1]=>2[2]=>3[4]=>4)。

4.

可以用来开启档案以便读/写的函数是______。正确答案:fopen()。[解析]fopen()函数可以用来开启档案以便读、写。

5.

要配置PHP环境,只需修改______文件。正确答案:php.ini。[解析]php.ini是PHP环境配置文件,httpd.conf是Apache配置文件,php.exe是PHP运行文件。

三、简答题1.

组合与继承的区别是什么?正确答案:组合和继承是面向对象中两种代码复用的方式。组合是指在新类里面引用原有类的对象,重复利用已有类的功能。继承是面向对象的主要特性之一,它允许设计人员根据其他类的实现来定义一个类的实现。组合和继承都允许在新的类中设置子对象(subobject),只是组合是显式的,而继承则是隐式的。组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应。

二者的区别在哪里呢?首先分析一个实例。Car表示汽车对象,Vehicle表示交通工具对象,Tire表示轮胎对象。三者的类关系如下图所示。

从上图中可以看出,Car是Vehicle的一种,因此是一种继承关系(又被称为is-a关系);而Car包含了多个Tire,因此是一种组合关系(又被称为has-a关系)。其实现方式如下:继承组合classVerhicle{}classCarextendsVerhicle{}classTire{}classCarextendsVerhicle{$t=newTire();}

2.

请简单介绍什么是视图。正确答案:视图是从数据库的基本表中选取出来的数据组成的逻辑窗口,它不同于基本表,是一个虚表,在数据库中,存放的只是视图的定义而已,而不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。

视图的作用非常多,主要有以下几点:首先,可以简化数据查询语句;其次,可以使用户从多角度看待同一数据;再次,通过引入视图,可以提高数据的安全性;最后,视图提供了一定程度的逻辑独立性等。

通过引入视图机制,用户可以将注意力集中在其关心的数据上而非全部数据,这样就大大提高了用户效率与用户满意度,而且如果这些数据来源于多个基本表结构,或者数据不仅来自于基本表结构,还有一部分数据来源于其他视图,并且搜索条件又比较复杂,那么需要编写的查询语句就会比较烦琐,此时定义视图就可以使数据的查询语句变得简单可行。定义视图可以将表与表之间的复杂操作连接和搜索条件对用户不可见,用户只需要简单地对一个视图进行查询即可,所以增加了数据的安全性,但是不能提高查询的效率。

3.

Memcache和Memcached有什么区别?正确答案:Memcache是一个自由开放的高性能内存对象缓存系统,可用于加速动态web应用程序,减轻数据库负载。Memcache是这个软件项目的一般叫法,但项目的主程序文件叫Memcached.exe,在服务端主要靠这个守护进程管理HashTable。因为这个进程名可以把这个软件系统叫Memcached。

PHP对该软件存在两个pecl扩展,分别是Memcache和Memcached。

它们的区别如下:

1)Memcache扩展是完全在PHP框架内开发的,而Memcached扩展是使用libMemcached开发的,在方法上Memcached的方法比Memcache多,但是用法方式都差不多。

2)Memcached因为使用了libMemcached所以只支持OO接口,而Memcache是OO和非OO两套接口并存的。

3)Memcached是支持BinaryProtocol的,而Memcache不支持,所以Memcached的性能更高。

4.

utf8编码需要注意哪些问题?正确答案:网站存在十几种不同的编码,如果编码不同,那么网页内容显示就会出现乱码。如果网站的编码为utf-8,那么相关的文件和数据库都必须使用utf-8编码,否则网页就会出现乱码。

具体需要注意utf8编码的文件有:

1)数据库需要用utf8编码,包括创建的数据库和表都必须使用utf8编码。

2)PHP代码连接数据库的时候,也必须指定所使用的编码为utf-8。

3)网站中所有文件都使用utf-8编码,在php文件中指定头部编码为utf-8,即header("content-type:text/html;charset=utf-8"),html文件也需要指定utf-8编码,即utf-8header("content-type:text/html;charset=utf-8")。

5.

什么是单例模式?正确答案:单例模式是在应用程序中最多只能拥有一个该类的实例存在,一旦创建就会一直在内存中。

由于单例模式的设定,所以它常应用于数据库类设计,可以保证只连接一次数据库。

单例类的特点如下:

1)单例类不能直接实例化创建,只能由类本身实例化。因此,构造函数必须标记为private,从而防止类被实例化。

2)需要保证一个能访问到的实例公开的静态方法和一个私有静态成员变量来保存类实例。

3)类中通常需要有一个空的私有clone()方法防止别人对单例类进行实例复制。

示例代码如下:

<?php

classDatabase

{

privatestatic$instance;

privatefunction__construct()

{

//todo

}

privatefunction__clone()

{

//todo

}

publicstaticfunctiongetInstance()

{

if(!(self::$instanceinstanceofself)){

self::$instance=newself();

}

returnself::$instance;

}

}

$a=Database::getInstance();

$b=Database::getlnstance();

print_r($a===$b);

?>

四、编程题在数据库test中的一个表student,字段是name、class、score,分别代表姓名、所在班级、分数。(请写出符合要求的SQL语句)1.

每个班级中的学生按照成绩降序排序。正确答案:select*fromstudentorderbyscoredesc;

2.

查出每个班的及格人数和不及格人数,格式为class、及格人数。正确答案:及格人数:selectclass,count(name)as'及格人数'fromstudentswherescore>=60groupbyclass;

不及格人数:selectclass,count(name)as'不及格人数'fromstudentswherescore<60groupbyclass;

3.

用PHP写入连接数据库("localhost","msuser","mspass")、执行以上SQL、显示结果、关闭数据库的过程。正确答案:<?php

$conn=mysql_connect('localhost','root','root');

mysql_select_db('test');

//每个班级中的学生按照成绩降序排序

$sql="select*fromstudentorderbyscoredesc";

//查出每个班的及格人数和不及格人数,格式为class、及格人数

$sql="selectclass,count(name)as'num'fromstudentwherescore>=60groupbyclass";

$result=mysql_query($sql);

//查询不及格人数

$sql2="selectclass,count(name)as'num'fromstudentwherescore<60groupbyclass";

$result2=mysql_query($sql2);

mysql_close();

?>

4.

已知随机数生成函数rand7()能产生的随机数是整数1~7的均匀分布,如何构造rand10()函数,使其产生的随机数是整数1~10的均匀分布。正确答案:<?php

∥产生的随机数是整数1~7的均匀分布

functionrand7()

{

returnrand()%7+1;

}

//产生的随机数是整数1~10的均匀分布

functionrand10()

{

$x=0;

do

{

$x=(rand7()-1)*7+rand7();

}while($x>40);

return$x%10+1;

}

for($i=0;$i!=10;++$i)

printf("%d",rand10());

printf("\n");

?>

程序的运行结果为

610818638107[解析]要保证rand10()产生的随机数是整数1~10的均匀分布,可以构造一个1~10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1~10*n区间上的一个随机数,那么x%10+1就是均匀分布在1~10区间上的整数。

根据题意,rand7()函数返回1~7的随机数,那么rand7()-1则得到一个离散整数集合,该集合为{0,1,2,3,4,5,6},集合中每个整数的出现概率都为1/7。那么(rand7()-1)*7得到另一个离散整数集合A,该集合元素为7的整数倍,即A={0,7,14,21,28,35,42},其中,每个整数的出现概率也都为1/7。而由于rand7()得到的集合B={1,2,3,4,5,6,7},其中每个整数出现的概率也为1/7。显然集合A与集合B中任何两个元素和组合可以与1~49之间的一个整数一一对应,即1~49之间的任何一个数,可以唯一地确定A和B中两个元素的一种组合方式,这个结论反过来也成立。由于集合A和集合B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/7*1/7=1/49。因此,(rand7()-1)*7+rand7()生成的整数均匀分布在1~49之间,而且,每个数的概率都是1/49。

所以,(rand7()-1)*7+rand7()可以构造出均匀分布在1~49的随机数,为了将49种组合映射为1~10之间的10种随机数,就需要进行截断,即将41~49这样的随机数剔除掉,得到的数1~40仍然是均匀分布在1~40的,这是因为每个数都可以看成一个独立事件。由1~40区间上的一个随机数x,可以得到x%10+1就是均匀分布在1~10区间上的整数。

5.

10个房间里放着随机数量的金币。每个房间只能进入一次,并只能在一个房间中拿金币。一个人采取如下策略:前4个房间只看不拿。随后的房间只要看到比前4个房间都多的金币数,就拿;否则就拿最后一个房间的金币。编程计算这种策略拿到最多金币的概率。正确答案:<?php

/*

**函数功能:把数组a看成房间,总共n个房间,

**

判断用指定的策略是否能拿到最多金币

**返回值:如果能拿到返回1,否则返回0

*/

functiongetMaxNum($a,$n)

{

//随机生成10个房间里金币的个数

for($i=0;$i<$n;$i++)

{

$a[$i]=rand()%10+1;//生成1~10的随机数

}

//找出前四个房间中最多的金币个数

$max4=0;

for($i=0;$i<4;$i++)

{

if($a[$i]>$max4)$max4=$a[Si];

}

for($i=4;$i<$n-1;$i++)

{

if($a[$i]>$max4)//能拿到最多的金币

return1;

}

return0;//不能拿到最多的金币

}

$a=array();

$monitorCount=1000;

$success=0;

for($i=0;$i<$monitorCount;$i++)

{

if(getMaxNum($a,10))$success++;

}

printf("%f\n",$success/$monitorCount);

?>

程序的运行结果为

0.421

运行结果与金币个数的选择以及模拟的次数都有关系,而且由于是个随机问题,因此同样的程序每次的运行结果也会不同。[解析]这道题是要求一个概率的问题,由于10个房间里放的金币的数量是随机的,因此,在编程实现的时候首先需要生成10个随机数来模拟10个房间里金币的数量。然后判断通过这种策略是否能拿到最多的金币。如果仅仅通过一次模拟来求拿到最多金币的概率显然是不准确的,那么就需要进行多次模拟,通过记录模拟的次数m,拿到最多金币的次数n,从而可以计算出拿到最多金币的概率n/m。显然这个概率与金币的数量以及模拟的次数有关系,模拟的次数越多,越能接近真实值。

6.

已知三个升序整数数组a[1]、b[m]和c[n],在三个数组中各找一个元素,使得组成的三元组距离最小。三元组距离的定义是,假设a[i]、b[j]和c[k]是一个三元组,那么距离为Distance=max(|a[i]-b[j]|,|a[i]-c[k]|,|b[j]-c[k]|),请设计一个求最小三元组距离的最优算法。正确答案:functionmaxNum($a,$b,$c){

$max=$a<$b?Sb:$a;

$max=$max<$c?$c:$max;

return$max;

}

functionminNum($a,$b,$c){

$min=$a<$b?$a:$b;

$min=$min<$c?$min:$c;

return$min;

}

functiongetMinDistance($a,$aLen,$b,$bLen,$c,$cLen){

$curDist=0;

$min=0;

$minDist=max($a);

$i=0;//数组a的下标

$j=0;//数组b的下标

$k=0;//数组c的下标

while(1){

$curDist=maxNum(abs($a[$i]-$b[$j]),abs($a[$i]-$c[$k]),abs($b[$j]-$c[$k]));

if($curDist<$minDist)

$minDist

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论