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

下载本文档

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

文档简介

某知名自营电子商务公司PHP工程师面试笔试真题及答案一、选择题1、PHP可以与HTML混编,当get请求传递一个rgb颜色,命名为bgcolor时,自动改变背景颜色的PHP代码为______

A.<?php<bodybgcolor="$_GET['bgcolor']"></body>?>

B.<html><bodybgcolor="<?php$_GET['bgcolor'];?>"></body></html>

C.<bodybgcolor="<?phpecho$_GET['bgcolor'];?>"></body>

D.<?phpecho'<bodybgcolor='.$_GET['rgbcolor'].'></body>'?>

2、解释性语言的特性包括______

A.非独立

B.效率低

C.独立

D.效率高

3、1,4,5,6,7,9,11,______

A.8

B.12

C.15

D.100

4、取得搜索语句的结果集中的记录总数的函数是______

A.mysql_fetch_row

B.mysql_rowid

C.mysql_num_rowsD.mysql_fetch_array

5、当声明函数时,不能给参数赋默认值的是______

A.当参数是布尔值时

B.当函数是类中的成员时

C.当参数是通过引用传递时

D.当函数只有一个参数时

E.永远不会

6、下面PHP代码的输出结果是______

<?php

classA{

public$num=100;

}

$a=newA();

$b=clone$a;

$a->num=200;

echo$b->num;

?>

A.100

B.200

C.没有输出

D.程序报错!

7、在向某台特定的计算机中写入带有效期的Cookie时总是会失败,而这在其他计算机上都正常。在检查了客户端操作系统传回的时间后,发现这台计算机上的时间和Web服务器上的时间基本相同,而且这台计算机在访问大部分其他网站时都没有问题。原因是______(双选)

A.浏览器的程序出了问题

B.客户端的时区设置不正确

C.用户的杀毒软件阻止了所有安全的Cookie

D.浏览器被设置为阻止任何Cookie

E.Cookie里使用了非法的字符

8、如果想要自动加载类,那么下面函数声明中,正确的是______

A.functionautoload($class_name)

B.function__autoload($class_name,$file)

C.function__autoload($class_name)

D.functionautoload($class_name,$file)

9、以下关于PHP命名空间的说法中,不正确的是______

A.访问任意全局类、函数或常量,都可以使用完全限定名称,例如,\strlen()或\Exception或INT_ALL

B.关键字namespace可用来显式访问当前命名空间或子命名空间中的元素,它等价于类中的this操作符

C.任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是类、函数和常量

D.常量__NAMESPACE__的值是当前命名空间名称的字符串。如果是在全局中,那么它不包括任何命名空间中的代码,本身是一个空字符串

10、创建一个自定义的流处理器的方法是______

A.调用stream_wrapper_register()函数,并定义一个进行流操作的类

B.用stream_wrapper_register()注册一个处理函数

C.创建一个和要处理的流封装器同名的类,并用fopen()打开

D.用stream_load()加载流封装器

二、填空题11、MySQL中count函数的作用是______。

12、final关键字的用法可以用于______。

13、借助继承,可以创建其他类的派生类。那么在PHP中,子类最多可以继承的父类个数为______。

14、版本控制工具市场占有率比较高的是______和______。

15、可以获得对象的类名的函数是______。

三、简答题16、如果某段与数据库交互的程序运行较慢,那么你将如何处理?

17、简述怎么合理地使用Memcache缓存?如果缓存数据量过大,那么怎么部署?(分布式,缓存时间,优化缓存数据)

18、请谈谈数据库中的事务。

19、请写出内核线程和用户线程的区别。

20、什么是MAC地址?

四、编程题21、公鸡5文钱1只,母鸡3文钱1只,小鸡1文钱买3只,现在用100文钱共买了100只鸡,问:在这100只鸡中,公鸡、母鸡和小鸡各是多少只?(设每种至少一只)

22、请用快速排序算法,对数组array(49,38,65,97,76,13,27,49)从小到大排序。

23、给定两个单链表,链表的每个结点代表一位数,计算两个数的和。例如,输入链表(3->1->5)和链表(5->9->2),输出8->0->8,即513+295=808,注意个位数在链表头。

24、给定以非递减顺序排序的三个数组,找出这三个数组中的所有公共元素。例如,给出下面三个数组:ar1=[2,5,12,20,45,85],ar2=[16,19,20,85,200],ar3=[3,4,15,20,39,72,85,190]。那么这三个数组的公共元素为[20,85]。

答案:

一、选择题

1、C[解析]

在HTML中嵌入PHP需要使用<?php?>tags标签,在标签内可以正常使用PHP代码,选项B虽然获取到了bgcolor的值,但是没有输出导致bgcolor的值为空,选项C把获取到的颜色值输出,则bgcolor可以获取到值。选项B错误,选项C正确。

所以,本题的答案为C。2、AB[解析]

解释性语言的程序不需要预先编译,在运行程序时才翻译成机器语言,每种解释性语言都是执行时才翻译,所以每执行一次就翻译一次效率非常低,并且依靠编译器才能将解释性语言翻译成机器语言,所以是非独立的。

所以,本题的答案为AB。3、C[解析]

本题中,最重要的解题方法就是找出数列的规律,从而推导出最后一个数是多少。通过研究已有的7个数,不难发现:第二项+第七项=4+11=15,第三项+第六项=5+9=14,第四项+第五项=6+7=13,两个数的和依次递减。可以推出这样一个结论:第一项+第八项=16,因为第一项的值为1,所以,第八项=16-1=15。

所以,本题的答案为C。4、C[解析]

对于选项A,mysql_fetch_row()函数的作用是从结果集中取得一行作为数字数组。选项A错误。

对于选项B,不存在mysql_rowid()函数。选项B错误。

对于选项C,mysql_num_rows()可以返回结果集中行的数目。选项C正确。

对于选项D,mysql_fetch_array()函数从结果集中取得一行作为关联数组或数字数组,或二者兼有。选项D错误。

所以,本题的答案为C。5、C[解析]

当参数被声明为通过引用传递时,不能给它赋默认值,此时解释器期望获得一个能在函数内部进行修改的变量。选项C正确。

所以,本题的答案为C。6、A[解析]

在用clone时,复制出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,而此过程相当于在内存中新开辟一块空间。选项A正确。

所以,本题的答案为A。7、BD[解析]

由于浏览器访问其他网站都正常,所以,不可能是浏览器程序出了问题。杀毒软件通常不会选择性地只阻止安全的Cookie(不过有可能会阻止所有的Cookie)。首先应当检查浏览器是否被设置为阻止所有Cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源,给Cookie设置有效期时用的是GMT时间,可能会出现Cookie在写入时就立刻过期,从而无法被脚本接收的情况。

所以,本题的答案为BD。8、C[解析]

自动加载类的函数的语法格式为__autoload($class),$class指的是待加载的类名。选项C正确。

所以,本题的答案为C。9、B[解析]namespace关键字是用来声明命名空间用的,它并不能等价于this操作符的功能。所以,选项B说法不对。

所以,本题的答案为B。10、A[解析]stream_wrapper_register()函数能注册一个新的流封装器,它需要接收操作流的类名称。

所以,本题的答案为A。二、填空题11、返回匹配指定条件的行数。

12、声明方法和类,分别表示方法不可被覆盖、类不可被继承(不能再派生出新的子类)。13、一个。[解析]

尽管其他编程语言允许多重继承,但PHP类只能继承一个父类,并且用关键字“extends”来实现继承。14、Git和SVN。[解析]

目前市面上存在比较的版本控制器有SVN(Subversion)、CVS(ConcurrentVersionsSystem)、Git、VSS(VisualSourceSafe)等,而被人们常用和市场占有率最高的是SVN和Git。15、get_class()。三、简答题16、1)首先提高数据库的查询速度,比如增加索引、优化表的结构。

2)优化程序代码,如果查询比较多,那么可以尽量用条件查询,减少查询语句,比如能用一条查询语句就不用两条。

3)提高服务器的配置,优化服务器,把不必要的进程关掉。

17、要合理地使用Memcache缓存,需要注意以下几点:

1)因为Memcache支持的最大存储对象大小为1MB,所以不能往Memcache存储一个大于1MB的数据。

2)往Memcache存储的所有数据,如果数据大小分布于各种chunk大小区间,从64B到1MB都有,那么会造成内存的极大浪费和Memcache的异常。所以需要注意数据大小的分布区间。

3)key的长度不能大于250个字符。

4)虚拟主机不允许运行Memcache服务,所以不能把Memcache部署到虚拟主机中。

5)因为Memcache可以轻松访问到,所以可以运行在不安全的环境中,如果对数据安全要求高,那么需要着重考虑运行环境的安全问题。

6)因为Memcache存储的数据都在内存中,如果服务器中挂掉,那么就会被清空,所以缓存的数据尽量是丢失了也不会有太大影响的数据。

如果缓存的数据量过大,那么可以采取以下的办法:

1)使用Memcache服务器集群的方法。首先是将数据安排放在不同的Memcache服务器上,可以将不同硬件服务器上的Memcache服务器再做成一个数据互相备份的组,避免数据的单点丢失问题。

2)缓存数据到数据库中。在数据库中先建一张表来说明Memcache服务器集群中缓存数据的存放逻辑,然后把缓存数据存到数据库中,可以保证数据库和缓存的数据双向存取。

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

19、根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程。

内核线程的建立和销毁都是由操作系统负责、通过系统调用完成的,操作系统在调度时,参考各进程内的线程运行情况做出调度决定。如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。用户线程多见于一些历史悠久的操作系统,如UNIX操作系统,不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位的,所以每个线程执行的时间相对减少。为了在操作系统中加入线程支持,采用了在用户空间增加运行库来实现线程,这些运行库被称为“线程包”,用户线程是不能被操作系统所感知的。

引入用户线程有以下4个方面的优势:

1)可以在不支持线程的操作系统中实现。

2)创建和销毁线程、线程切换等线程管理的代价比内核线程少得多。

3)允许每个进程定制自己的调度算法,线程管理比较灵活。

4)线程能够利用的表空间和堆栈空间比内核级线程多。

用户线程的缺点主要有以下两点:

1)同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。

2)页面失效也会导致整个进程都会被挂起。

内核线程的优缺点刚好与用户线程相反。实际上,操作系统可以使用混合的方式来实现线程。

20、MAC地址,也称为物理地址,用来定义网络设备的位置,它总共有48位,以十六进制表示,由两大块组成:IEEE(电气和电子工程师学会)分配给厂商的识别码和厂商内部定义的唯一识别码(如00-36-76-47-D6-7A)。

MAC地址会被烧入进网卡中,每块网卡的MAC地址在全世界都是唯一的。MAC地址应用在OSI参考模型中的数据链路层,通过MAC地址能够转发数据帧。四、编程题21、根据百钱买百鸡的要求,可以设有$i只公鸡,$j只母鸡,$k只小鸡,并且$i+$j+$k的总数为100,$i*5+$j*3+$k*1总价为100。依次对公鸡、母鸡、小鸡的总数循环求解出符合这两个公式的最优解。

实现代码如下:

<?php

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

for($i=1,$i<100;$i++){

for($j=1,$j<100;$j++){

for($k=1;$k<100;$k++){

if(($i+$j+$k==100)&&($i*5+$j*3+$k/3==100)){

echo"公鸡:".$i,'只,母鸡:',$j,'只,小鸡:',$k,'只<br>';

}

}

}

}

?>

程序的运行结果为

公鸡:4只,母鸡:18只,小鸡:78只

公鸡:8只,母鸡:11只,小鸡:81只

公鸡:12只,母鸡:4只,小鸡:84只

22、快速排序是一种非常高效的排序算法,它采用“分而治之”的思想,把大的问题拆分为小的问题,小的问题再拆分为更小的问题。其原理如下:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。

对于给定数组A[0],…,A[N-1],首先任意选取一个数据(通常选用数组的第一个元素)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。由此可见,一趟快速排序的算法如下:

1)设置两个变量i、j,并初始化为i=0,j=N-1。

2)以第一个数组元素作为关键数据(假设这个关键数据为key)。

3)从i开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换。

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换。

5)重复第3)、4)步,直到i=j(3)、(4)步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i、j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

以数组array(49,38,65,97,76,13,27,49)为例。

第一趟排序过程如下:

初始状态:[4938659776132749]

j向左扫描,第一次交换后:[2738659776134949]

i向右扫描,第二次交换后:[2738499776136549]

j向左扫描,位置不变,第三次交换后:[2738139776496549]

i向右扫描,位置不变,第四次交换后:[2738134976976549]

j向左扫描[2738134976976549]

整个排序过程如下:

初始状态:[4938659776132749]

一趟排序之后:[273813]49[76976549]

二趟排序之后:[13]27[38]49[4965]76[97]

三趟排序之后:1327384949[65]7697

最后的排序结果:1327384949657697

根据以上的实现原理,具体的实现代码如下:

<?php

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

functionquickSort(&$arr,$low,$hight){

if($low>=$hight){

return;

}

$first=$low;

$last=$hight;

$key=$arr[$first];

while($first<$last){

while($first<$last&&$arr[$last]>=$key){

--$last;

}

$arr[$first]=$arr[$last];

while($first<$last&&$arr[$first]<=$key){

++$first;

}

$arr[$last]=$arr[$first];

}

$arr[$first]=$key;

quickSort($arr,$low,($first-1));

quickSort($arr,($first+1),$hight);

}

$arr=array(49,38,65,97,76,13,27,49);

echo"排序前:";

foreach($arras$k=>$val){

echo$val.'';

}

echo"<br>排序后:";

quickSort($arr,0,intval(count($arr)-1));

foreach($arras$k=>$val){

echo$val.'';

}

?>

程序的运行结果为

排序前:4938659776132749

排序后:1327384949657697

快速算法是通过分治递归来实现的,其效率很大程度上取决于参考元素的选择,可以选择数组的中间元素,也可以随机得到三个元素,然后选择中间的那个元素(三数中值法)。另外还有一点,就是当分割时,如果分割出来的子序列的长度很小(小于20),那么通常递归的排序效率就没有诸如插入排序或希尔排序那么快了。因此可以先判断数组的长度,如果小于10,那么直接用插入排序,而不是递归调用快速排序。

23、主要思路:对链表中的结点直接进行相加操作,把相加的和存储到新的链表对应的结点中,同时还要记录结点相加后的进位。如下图所示。

使用这个方法需要注意如下几个问题:①每组结点进行相加后需要记录其是否有进位;②如果两个链表h1与h2的长度不同(长度分别为L1和L2,且L1<L2),当对链表的第L1位计算完成后,接下来只需要考虑链表h2剩余结点的值(需要考虑进位);③对链表所有结点都完成计算后,还需要考虑此时是否还有进位,如果有进位,则需要增加新的结点,此结点的数据域为1。实现代码如下:

<?php

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

//链表结点

classnode{

public$data;

//存储元素

public$next;

//下一结点

publicfunction__construct($data){

$this->data=$data;

$this->next=NULL;

}

}

//单链表

classlinkList{

public$header;

//链表头结点

//构造方法

publicfunction__construct($data=NULL){

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

}

//获取链表长度

publicfunctiongetLinkLength(){

$i=0;

$current=$this->header;

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

$i++;

$current=$current->next;

}

return$i;

}

//添加结点数据

publicfunctionaddLink($node){

$current=$this->header;

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

$current=$current->next;

}

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

$current->next=$node;

}

//清空链表

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;

}

}

}

/*

**函数功能:对两个带头结点的单链表所代表的数相加

**输入参数:h1:第一个链表头结点;h2:第二个链表头结点

**返回值:相加后链表的头结点

*/

functionadd($h1,$h2){

$h1=$h1->header;

$h2=$h2->header;

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

return$h2;

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

return$h1;

$c=0;

//用来记录进位

$sum=0;

//用来记录两个结点相加的值

$p1=$h1->next;

//用来遍历h1

$p2=$h2->next;

//用来遍历h2

$tmp=NULL;

//用来指向新创建的存储相加和的结点

$resultHead=newlinkList();

//相加后链表头结点

$p=$resultHead;

//用来指向链表resultHead最后一个结点

while($p1&&$p2){

$tmp=newlinkList();

$sum=$p1->data+$p2->data+$c;

$tmp->header->data=$sum%10;

//两结点相加和

$c=$sum/10;

//进位

$p->header->next=$tmp;

$p=$tmp;

$p1=$p1->next;

$p2=$p2->next;

}

//链表h2比h1长,接下来只需要考虑h2剩余结点的值

if($p1=NULL){

while($p2){

$tmp=newlinkList();

$sum=$p2->header->data+$c;

$tmp->header->data=$sum%10;

$c=$sum/10;

$p->header->next=$tmp;

$p=$tmp;

$p2=$p2->next;

}

}

//链表h1比h2长,接下来只需要考虑h1剩余结点的值

if($p2==NULL){

while($p1){

$tmp=newlinkList();

$sum=$p1->data+$c;

$tmp->header->data=$sum%10;

$c=$sum/10;

$p->header->next=$tmp;

$p=$tmp;

$p1=$p1->next;

}

}

//如果计算完成后还有进位,那么增加新的结点

if($c==1){

$tmp=newlinkList();

$tmp->header->data=1;

$p->header->next=$tmp;

}

return$resultHead;

}

$head1=newlinkList();

$head2=newlinkList();

for($i=1;$i<7;$i++){

$head1->addLink(newnode($i+2));

}

$num=0;

for($i=9;$i>4;$i--){

$head2->addLink(newnode($i));

$num++;

}

printf("Head1:

");

print_r($head1->getLinkList());

printf("<br>Head2:

");

print_r($head2->getLinkList());

printf("<br>相加后:");

$addResult=add($head1,$head2);

while($addResult->header->next!=NULL){

echo$addResult->header->data."";

if($addResult->header->next==NULL){

break;

}

$addResult=$addResult->header->next;

}

echo$addResult->header->data;

//释放链表所占的空间

$head1->clear();

$head2->clear();

?>

程序的运行结果为

Head1:

345678

Head2:

98765

相加后:233339

前五位可以按照整数相加的方法依次从左到右进行计算,第五位7+5+1(进

温馨提示

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

评论

0/150

提交评论