某知名电子商务公司PHP工程师面试笔试真题5_第1页
某知名电子商务公司PHP工程师面试笔试真题5_第2页
某知名电子商务公司PHP工程师面试笔试真题5_第3页
某知名电子商务公司PHP工程师面试笔试真题5_第4页
某知名电子商务公司PHP工程师面试笔试真题5_第5页
已阅读5页,还剩11页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

某知名电子商务公司PHP工程师面试笔试真题5一、选择题1.

毕业典礼后,某宿舍三位同学把自己的毕业帽扔了,随后每个人随机地拾起帽子,三个人中没有人选到自己原来戴的帽子的概率是______A.1/2B.(江南博哥)1/3C.1/4D.1/6正确答案:B[解析]本题中,不考虑任何情况,捡到帽子的情况有3*2*1=6种。

每个人都不能捡到自己的帽子,情况有两种:A-c、B-a、C-b或者A-b、B-c、C-b,其中,A、B和C分别代表三位同学,a、b和C分别代表AB和C三个人的帽子,那么应该是2/6=1/3。

所以,本题的答案为B。

2.

用stream_get_meta_data函数,流API无法提供______A.是否仍然有数据未读B.流是否过期C.流是否被阻挡D.通过流传输了多少数据E.流构建的成分正确答案:D[解析]stream_get_meta_data()函数可以获取是否仍然有数据未读、流是否过期、流是否被阻挡、流构建的成分等信息,但是无法显示通过流传输了多少数据,只能显示还剩多少数据需要传输。选项D正确,选项A选项B选项C选项E错误。

所以,本题的答案为D。

3.

通过PHP发送有多个收件人或者MIME兼容的邮件,需要遵循的步骤是______A.将必要的头信息(header)通过$message参数(第三个参数)传递给mail函数B.用PHP代码,通过SMTP直接与MTA连接C.将附加的头信息传递给mail函数的$additionalheaders参数(第四个参数),每个header一行D.向多个收件人发送E-mail是允许的。PHP不支持发送MIMEE-mailE.向mail函数传递$additional_headers参数,每个header一行,行以\r\n结尾正确答案:E[解析]对于选项A,在使用mail()函数的第三个参数进行信息发送的时候,header不是必要的。选项A错误。

对于选项B,PHP可以使用mail函数发送任何格式合法的电子邮件,必须使用SMTP的PHP脚本,但是不一定要与MTA连接。选项B错误。

对于C选项,在E-mail中添加额外的头信息,需要向函数传递$additional_headers参数,每个头信息以一个回车符(\n)和一个换行符(\r\n)结尾。选项E正确,选项C错误。

对于选项D,如果发送的邮件由多种文本格式组成,比如带有附件或HTML的邮件,那么不仅需要添加额外的头信息,而且还需要添加MIME类型。选项D错误。

所以,本题的答案为E。

4.

以下代码的运行结果为______

<?php

mysq1_connect('localhost','root',"");

$result=mysq1_query("SELECTid,nameFROMtb1");

while($row=mysq1_fetch_array($result,MySQL_ASSOC)){

echo'ID:'.$row[0].'Name:'.$row[];

}

?>A.报错B.循环换行打印全部记录C.无任何结果D.只打印第一条记录正确答案:A[解析]因为代码中没有指明要操作的数据库名,所以会报错。

所以,本题的答案为A。

5.

你的PHP以CGI的形式运行在Linux+Apache系统的cgi-bin文件夹中。如果有人打开以下URL那么将发生什么?/cgi-bin/php?/etc/passwd。______A./etc/passwd目录下的文件都会被显示出来,造成安全隐患B.操作系统会检查Apache是否允许打开/etc/passwd目录C./etc/passwd字符串作为参数传给了脚本D.什么都不会发生。CGI模式下的PHP将自动拒绝此次访问E.PHP尝试把/etc/passwd作为PHP脚本进行解释正确答案:D[解析]对于选项A,因为PHP以CGI模式运行,所以为了安全,PHP会采取一些措施来减少常见的安全隐患。选项A错误。

PHP中的安全措施是应用在把任意某个文件作为命令行参量传递给解释器执行的时候。如果不是执行这个措施,那么PHP将尝试读取/etc/passw——一个“全球可读(world-readable)”的文件,同时解释器把它视作。PHP脚本来执行,最终导致所有的用户账号被输出到客户端上。因为PHP内建的安全机制,所以页面是不会有内容输出的。选项D正确,选项B选项C选项E错误。

所以,本题的答案为D。

6.

以下有关PHP面向对象的说法中,不正确的是______A.如果PHP的子类中定义了构造函数,则创建子类的对象时,会隐式地调用其父类的构造函数B.序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字C.类名可以是任何非PHP保留字的合法标签,汉字也可以作为PHP的类名D.要实现一个接口,使用implements操作符,类中必须实现接口中定义的所有方法,否则会报一个致命错误正确答案:A[解析]当子类和父类中都存在构造函数时,子类中的构造函数会覆盖父类的构造函数,当实例化子类时,会自动调用子类的构造函数。选项A正确。

所以,本题的答案为A。

7.

以下关于JavaScript的说法中,不正确的是______A.语句“alert(1==true);”和语句“alert(2==true);”的结果都是trueB.JS的数组其实就是对象,用for...in语句可以遍历数组的所有属性C.JS中的对象通过引用来传递,它们永远不会被复制D.JS中的函数就是对象,所以它们可以像任何其他的值一样被使用正确答案:A[解析]alert(2==true)返回的是false,因为JavaScript默认1等同true,0等同false,而其他数字和布尔型都不相等,所以返回的结果都是false。选项A说法错误。

所以,本题的答案为A。

8.

下列代码的输出结果是______

<?php

$x=dir(".");

while($y=$x->read())

{

echo$y;

}

$x->close();

?>A.显示所有驱动器的内容B.显示当前文件夹下的所有文件名C.显示所有文件夹的名称D.编译错误正确答案:B[解析]dir(".")函数用来获取当前文件夹的路径,返回的是一个对象给$x,接着就可以通过$x读取文件夹下的文件,通过while语句输出。

所以,本题的答案为B。

9.

概要分析器(profiler)的作用是______A.创建关于脚本结构的档案B.把脚本转化成UML图C.精确测算脚本不同部分的运行时间D.计算脚本通过Web服务器执行时的维度E.扫描脚本,识别由常见错误导致的bug正确答案:C[解析]概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间,可以用来找出网站的问题和解决网站瓶颈。选项C正确,选项A选项B选项D选项E错误。

所以,本题的答案为C。

10.

下面对于echo、print的描述中,正确的是______A.echo、print都可以打印多个参数B.print可以打印多个参数,echo不可以C.echo可以打印多个参数,print不可以D.echo、print都不可以打印多个参数正确答案:C[解析]echo和print都可以直接把变量输出来,但echo输出的效率比print高,因为echo输出没有返回值,而print输出后会自带返回值。echo和print的区别在于,echo可以输出一个或多个字符串,而print只允许输出一个字符串,返回值总为1。

所以,本题的答案为C。

11.

自定义函数中,返回函数值的关键字是______A.returnsB.closeC.returnD.back正确答案:C[解析]函数内的返回关键字是return,不存在returns、close、back等关键字。选项C正确。

所以,本题的答案为C。

12.

有如下代码:

<?php

$a=1;

sum(){

echo$a;

}

sum();

?>

程序输出为______A.1B.10C.100D.报错正确答案:D[解析]在本题中,$a=1是一个全局变量,而函数内的$a是一个局部变量且没有定义,全局变量不能影响和改变函数内的局部变量。当执行sum()函数时,由于局部变量$a没有定义,报出错误提示Notice:Undefinedvariable:

ainD:\phpstudy\WWW\code.phponline3。选项D正确,选项A选项B选项C错误。

所以,本题的答案为D。

13.

若$y、$x为int型变量,则执行以下语句后,$y的值为______

$x=1;

++$x;

$y=$x++;A.1B.2C.3D.0正确答案:B[解析]前置运算++$x,首先对$x执行加1运算,然后返回$x,对于后置运算$x++,首先返回$x,然后对$x执行加1运算。

本题中,首先声明了变量x,并对其赋值为1,然后使用前置运算符++,先对$x执行加1运算,此时$x的值变为2。最后执行$y=$x++;语句,此时使用了后置运算符++,先把$x的值赋给$y,再对自身+1,运算后,$y为2,$x为3。

所以,本题的答案为B。

14.

PHP定义变量的方法是______A.varB.$C.$$D.&正确答案:B[解析]对于选项A,var主要用于JavaScript声明变量。选项A错误。

对于选项B,$是PHP声明变量的唯一符号。选项B正确。

对于选项C,PHP声明变量只有一个$,而不是两个$。选项C错误。

对于选项D,&是与运算符,在变量前也可以作为引用符,而不是变量定义符。选项D错误。

所以,本题的答案为B。

15.

假设定义了一个testclass类,它的构造函数的函数名是______A.__constructB.InitializeC.TestclassD.__testclassE.只有PHP5才支持构造函数正确答案:A[解析]构造函数默认为__construct()函数,或者是类名和函数名相同,该函数功能等价于构造函数。选项A正确,选项B选项C选项D错误。

所以,本题的答案为A。

二、填空题1.

一个函数的参数不能是对变量的引用,除非在php.ini中把______设为on。正确答案:allow_call_time_pass_reference。[解析]在PHP函数调用的时候,基本数据类型默认会使用值传递,而不是引用传递。allow_call_time_pass_reference选项的作用为是否启用在函数调用时强制参数按照引用传递。如果把allow_call_time_pass_reference配置为on,那么在函数调用的时候会默认使用引用传值。但是不推荐使用这种方法,原因是该方法在未来的版本中很可能不再支持。如果想使用引用传递,那么推荐在函数调用的时候显式地使用&进行引用传递。

2.

类的属性可以序列化后保存到session中,从而以后可以恢复整个类,这要用到的函数是______。正确答案:serialize()/unserialize()。[解析]serialize()函数可以将对象或数组序列化为可持久化或可传输的格式的过程,而unserialize()函数是和序列化相对的反序列化函数,它可以将流转换为对象或数组,重新创建该对象。所以如果要保存一个类的属性在session中,那么可以使用setialize()将该类的属性序列化,然后存储在session中,在需要使用该类的属性的地方再通过unserialize()转换为对象属性进行使用。

3.

索引数组的键是______,关联数组的键是______。正确答案:整型,字符串。[解析]用整型做键的数组是索引数组,用字符串做键的数字是关联数组。

4.

对数组进行逆向排序并保持索引关系的函数是______,将字符串转换成小写的是______,字符串反转函数是______。正确答案:arsort(),strtolower(),strrev()。[解析]对数组进行逆向排序,并且保持原有的索引关系的函数是arsort()。将字符串转换成小写的函数是strtolower(),而将字符串反转的函数是strrev()函数。

5.

可以把浏览器转向到另一个页面的函数是______。正确答案:header()。[解析]header()函数可以在浏览器中跳转到另一个页面,示例代码为header("Location:/")。

三、简答题1.

线程同步有哪些机制?正确答案:现在流行的进程、线程同步互斥的控制机制,其实是由最原始、最基本的4种方法(临界区、互斥量、信号量和事件)实现的。

1)临界区:通过对多线程的串行化来访问公共资源或一段代码,其速度快,适合控制数据访问。在任意时刻只允许一个线程访问共享资源,如果有多个线程试图访问共享资源,那么当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并一直等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占。

2)互斥量:为协调对一个共享资源的单独访问而设计,只有拥有互斥量的线程才有权限去访问系统的公共资源,因为互斥量只有一个,所以能够保证资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

3)信号量:为控制一个具有有限数量的用户资源而设计。它允许多个线程在同一个时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。

4)事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

2.

说说你对代码管理的了解,常使用哪些代码版本控制软件。正确答案:一个项目由一个团队去开发时,每个人将自己写好的代码提交到版本服务器中,SVN可以自动帮你合并修改后的代码文件,并且可以让项目回滚到任意版本。可以方便项目负责人对版本进行管理,提高开发效率,保证团队开发的协作。

常用的版本控制软件有SVN、Git等。

3.

GET和POST的区别有哪些?正确答案:主要区别有4个方面:

1)语义不同,GET是获取数据,POST是提交数据。

2)HTTP协议规定GET比POST安全,因为GET只做读取,不会改变服务器中的数据。但这只是规范,并不能保证请求方法的实现也是安全的。

3)GET请求会把附加参数带在URL上,而POST请求会把提交数据放在报文内。在浏览器中,URL长度会被限制,所以GET请求能传递的数据有限,但HTTP协议其实并没有对其做限制,都是浏览器在控制。

4)HTTP协议规定GET是幂等的,而POST不是,所谓幂等是指多次请求返回的结果相同。实际应用中,并不会这么严格,当GET获取动态数据时,每次的结果可能会有所不同。

4.

Redis与Memcache有什么区别?正确答案:Redis是一个完全开源免费的高性能key-value数据库,它具有丰富的数据类型,可以支持数据的持久化,将内存中的数据保存在磁盘中,当重启服务器时可以再次加载使用。

Memcache是一个高性能的分布式内存对象缓存系统,用于动态的Web应用中帮助数据库减轻负担,在内存中缓存数据和对象,减少每次访问数据时对数据库的访问次数,从而提高访问速度。

它们具有以下几点区别:

1)Redis和Memcache的最大区别是,虽然Memcache和Redis都是将数据存在内存中,是内存数据库,但当Redis存储时,并不是所有的数据都一直存储在内存中,而Memcache存储时,数据都存在内存中。

2)数据安全问题,由于Memcache把数据全部存在内存之中,当服务器挂掉后,重启服务器数据就会丢失,而Redis可以定期保存数据到磁盘中做持久化存储,当需要时可以再加载使用。对于灾难恢复,当Memcache挂掉后,数据不可恢复,但Redis数据丢失后可以通过aof恢复。

3)Redis支持多种数据结构存储,例如list、set、hash等数据结构的存储,而Memcache主要是在内存中维护一个统一的巨大的hash表进行存储数据,它只支持简单的key/value类型的数据存储,但它可以存储图片、视频、文件及数据库检索结果等。

4)数据备份问题,Redis支持数据的备份,即master-slave模式的数据备份。而因为Memcache不支持数据持久化,所以无法进行数据备份。

5)在内存使用率上,如果使用简单的key-value存储,那么Memcache的内存利用率更高,而如果Redis采用hash结构来做key-value存储,那么由于其组合式的压缩,其内存利用率会高于Memcache。具体和应用场景、数据特性有关。

6)在线程上的比较,因为Memcache是支持多线程的,而Redis只支持单线程,所以CPU利用方面Memcache优于Redis。

7)它们的扩展都需要做集群;实现方式:master-slave、Hash。

8)数据的读写方面,Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上Memcache更强。

5.

什么是数据库索引?主键索引与唯一索引有什么区别?索引的优缺点是什么?正确答案:索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。它主要提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

主键索引与唯一索引的区别是主键是一种唯一性索引,必须指定为主键,并且每个表只能有一个主键。而唯一索引的索引列的每个值都只能出现一次,即数据必须唯一。

索引的优点如下:

1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

2)可以大大加快数据的检索速度。

3)加速表与表之间的连接。

4)使用索引后,在数据检索时使用分组和排序子句可以显著减少查询中分组和排序的时间。

5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点如下:

1)索引的创建和维护都会耗费时间,并且耗费的时间随着数据量的增加而增加。

2)除了数据表需要占据空间外,索引也需要占据一定的物理空间,并且建立聚簇索引,需要的空间更大。

3)当对表中的数据进行增删改时,索引需要动态的维护,降低了数据的维护速度。

四、编程题1.

给定一个没有排序的链表,去掉其重复项,并保留原顺序,例如,链表1->3->1->5->5->7,去掉重复项后变为1->3->5->7。正确答案:主要思路为,通过双重循环直接在链表上进行删除操作。外层循环用一个指针从第一个结点开始遍历整个链表,然后内层循环用另外一个指针遍历其余结点,将与外层循环遍历到的指针所指结点的数据域相同的结点删除,如下图所示。

假设外层循环从outerCur开始遍历,当内层循环指针innerCur遍历到上图点画线所框的位置(outerCur->data==innerCur->data)时,此时需要把innerCur指向的结点删除。具体步骤如下:

1)用tmp记录待删除的结点的地址。

2)为了能够在删除tmp结点后继续遍历链表中其余的结点,使innerCur指向它的后继结点,即innerCur=innerCur->next。

3)从链表中删除tmp结点。

4)释放tmp结点所占的内存空间。

实现代码如下:

<?php

header("content-type:text/html;charset=utf-8");

//链表结点

classnode{

public$data;

//存储数据

public$next;

//下一结点

publicfunction__construct($data){

$this->data=$data;

$this->next=NULL;

}

}

//单链表

classlinkList{

private$header;

//链表头结点

//构造方法

publicfunction__construct($data=NULL){

$this->header=newnode($data);

}

//添加结点数据

publicfunctionaddLink($node){

$current=$this->header;

while($current->next!=NULL){

$current=$current->next;

}

$node->next=$current->next;

$current->next=$node;

}

//删除链表结点

publicfunctionfree($data){

$current=$this->header;

$flag=false;

while($current->next!=NULL){

if($current->next->data===$data){

$flag=true;

break;

}

$current=$current->next;

}

if($flag){

$current->next=$current->next->next;

}else{

echo"未找到data=".$data."的结点!<br>";

}

}

//清空链表

publicfunctionclear(){

$this->header=NULL;

}

//获取链表

publicfunctiongetLinkList(){

$current=$this->header;

if($current->next==NULL){

echo("链表为空!");

return;

}

while($current->next!=NULL){

echo$current->next->data."";

if($current->next->next=NULL){

break;

}

$current=$current->next;

}

}

//函数功能:对带头结点的无序单链表删除重复的结点

publicfunctionremoveDup(){

$head=$this->header;

if($head==NULL||$head->next=NULL)

return;

$outerCur=$head->next;

//外层循环指针,指向链表第一个结点

$innerCur=NULL;

//内存循环用来遍历outerCur后面的结点

$innerPre=NULL;

//innerCur的前驱结点

$tmp=NULL;

//用来指向被删除结点的指针

for(;$outerCur!=NULL;$outerCur=$outerCur->next){

for($innerCur=$outerCur->next,$innerPre=$outerCur;$innerCur!=NULL;){

//找到重复的结点并删除

if($outerCur->data==$innerCur->data){

$tmp=$innerCur;

$innerPre->next=$innerCur->next;

$innerCur=$innerCur->next;

}else{

$innerPre=$innerCur;

$innerCur=$innerCur->next;

}

}

}

}

}

$lists=newlinkList();

$lists->addLink(newnode(1));

$lists->addLink(newnode(3));

$lists->addLink(newnode(1));

$lists->addLink(newnode(5));

$lists->addLink(newnode(5));

$lists->addLink(newnode(7));

echo"删除重复结点前:";

$lists->getLinkList();

echo"<br>删除重复结点后:";

$lists->removeDup();

$lists->getLinkList();

//释放链表所占的空间

$lists->clear();

?>

程序的运行结果为

删除重复结点前:131557

删除重复结点后:1357

算法性能分析:由于这个算法采用双重循环对链表进行遍历,因此,时间复杂度为O(n2),其中,n为链表的长度。在遍历链表的过程中,使用了常量个额外的指针变量来保存当前遍历的结点、前驱结点和被删除的结点,因此,空间复杂度为O(1)。

2.

猴子第一天摘了若干个桃子,当即吃了一半,它还不解馋,于是又多吃了一个;第二天,它吃了剩下桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?正确答案:本题可以采用逆向思维,从后往前推断,发现其中有相同的地方,即出现递推公式,可以采用递归方法。令S10=1,可以得出S9=2*(S10+1),简化罗列关系为

S9=2*S10+2

S8=2*S9+2

...

Sn=2*Sn+2

实现代码如下:

<?php

header("Content-type:text/html;charset=utf-8");

$s=0;

$n=1;//最后一

温馨提示

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

评论

0/150

提交评论