一、选择题 8. 以下是一个类的声明,对成员属性正确的赋值方式是______
<?php
class Test{
private $a;
static $b;
function setA($a){
$this->a=$a;
}
}
$test=new test();
?>
A.$test->a="abc"; B.Test::$b="abc"; C.Test::setA("abc"); D.$test->b="abc";
A B C D
B
[解析] 对于选项A,因为$a是私有方法,所以不能在外部执行赋值操作。选项A错误。 对于选项B,要对类中的静态常量赋值可以使用“类名::变量”的形式赋值,可以对成员属性$b赋值。选项B正确。 对于选项C,因为setA()函数不是一个静态函数,所以不能使用Test::setA()的格式在类外调用函数,可以使$test->setA("abc")的方式调用函数。选项C错误。 对于选项D,因为$b是静态变量,所以不能使用$this->b方式赋值,赋值方式应该为Test::$b="abc"。选项D错误。 所以,本题的答案为B。
9. 可以用来表现以下条件判断最合适的语法结构是______
if($a=='a'){
somefunction();
}else if($a=='b'){
anotherfunction();
}else if($a=='c'){
dosomething();
}else{
donothing();
}
A.没有default的switch语句 B.一个递归函数 C.while语句 D.有default的switch语句
A B C D
D
[解析] 对于if...elseif...else结构的分支结构程序可以使用switch语句进行优化,从而可以避免冗长的代码块。本题中,else相当于switch里面的default部分,即条件没有符合的都可以执行到default里面的语句。选项A错误,选项D正确。 逻辑判断语句是不可能被改成循环语句或递归函数完成对应功能的,选项B选项C错误。 所以,本题的答案为D。
二、填空题 1. PHP中的错误控制操作符是______。
@
[解析] PHP支持一个错误控制运算符@。当将其放置在一个php表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
2. 以Apache模块的方式安装PHP,在文件http.conf中首先要用语句______动态装载PHP模块,然后用语句______使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理。
LoadModule;AddType application/x-httpd-php.php
[解析] 在用Apache模块的方式安装PHP时,需要先在http.conf配置文件中加入LoadModule说明加载PHP模块的功能。保存好配置文件后,还需要使用AddTypeapplication/x-httpd-php.php指明Apache对PHP文件的支持。
3. 打开php.ini中的safe_mode,会影响的函数有______、______、______、______、______、______。
fopen()、mkdir()、rmdir()、set_time_limit()、mysql_connect()、mail()
[解析] PHP的safa_mode提供了一个基本安全的共享环境,在一个有多个用户账户存在的PHP开发的Web服务器上。当安全模式打开的时候,部分函数将被完全地禁止,而还有部分函数的功能将会受到限制。下面重点给出其中的一部分: 1)fopen()、mkdir()、rmdir()检查被操作的目录是否与正在执行的脚本有相同的UID。 2)创建新文件(只能在属于当前用户的目录下创建文件)。 3)dl()函数在安全模式下被禁用。 4)set_time_limit()在安全模式下不起作用。 5)mysql服务器所用的用户名必须与调用mysql_connect()的文件的拥有者用户名相同。 6)mail()在安全模式下,第5个参数被屏蔽。
4. 代码return?=='a';在“?”中加入______函数后返回true。
chr(65)
[解析] ord()函数可以返回字符串的首个字符的ASCII值。chr()函数可以返回指定ASCII值的字符串,可以通过chr(65)转换成字符串A(备注:字符'A'的ASCII值为65),和A比较为真返回TRUE。而65+"和"+65都不能强制转换成字符串A,无法和A比较为真。
5. 获得当前会话ID的方法是______。
session_id()
[解析] 可以通过session_id()函数获取和设置当前会话的ID。使用session_id()时,如果当前存在会话ID,那么返回当前会话ID,如果没有会话,那么返回空字符串("")。
三、简答题 1. 请谈谈数据库中的事务。
事务是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,那么其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
2. Session的原理是什么?大型网站中,使用Session应注意什么?
Session用来标识服务器与浏览器的一次会话过程,服务器会给每个Session分配一个唯一的会话ID(SID)。SID可以看作与任意数量的数据有关联,在HTTP无状态行为下,可以通过两种方式实现: 1)通过Cookie存储SID并在必要时获取SID,在页面中使用和SID相关的各项数据,即使会话结束了,Cookie也可以在客户端保存,并在后续会话中读取使用。 2)URL重写,在每个请求页面的本地URL上增加SID。无论客户什么时候点击这些链接,都会通过SID自动传播,这样即使客户端禁用Cookie,也不影响会话处理功能,可以正常使用;但是这种方法也存在一些问题,例如,URL重写在会话之间不能保持持久性,也无法阻止用户将URL分享给别人。 在大型网站中,因为访问量比较大,所以应用服务器一般都会做集群部署,Session是存储在每个服务器中的,这时需要注意实现各个服务器之间的Session共享。
3. 使用Memcache需要注意哪些问题?
1)将程序、Memcache、mysql分开存放。在实际的开发过程中,因为Memcache使用过程中把数据缓存在内存中,因此会消耗很大的内存。所以建议把代码、mysql数据库和Memcache分开存放。 2)不要使用Memcache保存重要数据。因为Memcache是把数据存放在内存中,所以服务器突然断电或挂掉,重启后数据就会消失,没有办法找回。所以建议不要使用Memcache保存重要的数据。 3)定期查看缓存的分布状况和击中情况。只有定期查看缓存的分布状况和击中情况才能更好地分析缓存的工作效率和对缓存进行优化,发现缓存中可能存在的问题并及时解决。
4. 请简述PHP变量名的命名规则。
PHP变量的命名遵守以下几点规则: 1)变量名必须以$开头,后面跟变量名。 2)变量名须以字母或下划线开头。 3)变量名不能以数字开头,但可以包含字母(A~z,a~z)、数字(0~9)或下划线(_)。 4)变量名不允许包含空格。 5)变量名区分大小写,即$a与$A是两个不同的变量。
5. 什么是数据库索引?主键索引与唯一索引有什么区别?索引的优缺点是什么?
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。它主要提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。 主键索引与唯一索引的区别是主键是一种唯一性索引,必须指定为主键,并且每个表只能有一个主键。而唯一索引的索引列的每个值都只能出现一次,即数据必须唯一。 索引的优点如下: 1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 2)可以大大加快数据的检索速度。 3)加速表与表之间的连接。 4)使用索引后,在数据检索时使用分组和排序子句可以显著减少查询中分组和排序的时间。 5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 索引的缺点如下: 1)索引的创建和维护都会耗费时间,并且耗费的时间随着数据量的增加而增加。 2)除了数据表需要占据空间外,索引也需要占据一定的物理空间,并且建立聚簇索引,需要的空间更大。 3)当对表中的数据进行增删改时,索引需要动态的维护,降低了数据的维护速度。
四、编程题 1. 给一行文字$String,如何编写一个正规表达式,把$String内的div标签除去?
根据题意,可使用正则匹配去掉HTML标签,实现代码如下: <?php $String='<div>This is a test</div>'; $pattern='/<(.*?)>(.*?)<∨(.*?)>/'; echo preg_replace($pattern,'\\2',$String); ?>
2. 用PHP脚本解析出:http://srfi.schemers.org/srfi-28/mail-archive/maillist.html这个页面中出现的所有email,并保存到数组。
根据题意实现代码如下:(最后获得email地址$matches数组) <?php $mails=file_get_contents('http://srfi.schemers.org/srfi-28/mail-archive/maillist.html'); $pattern="/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/"; if(preg_match_all($pattern,$mails,$matches)){ print_r($matches); ?>
3. 给定一个数d和n,如何计算d的n次方?例如,d=2,n=3,d的n次方为2
3 =8。
可以把n的取值分为如下几种情况: 1)当n=0时,计算结果肯定为1。 2)当n=1时,计算结果肯定为d。 3)当n>0时,计算方法为初始化计算结果result=1,然后对result执行n次乘以d的操作,得到的结果就是d的n次方。 4)当n<0时,计算方法为初始化计算结果result=1,然后对result执行|n|次除以d的操作,得到的结果就是d的n次方。 以2的三次方为例,首先初始化result=1,接着对result执行3次乘以2的操作:result=result*2=1*2=2,result=result*2=2*2=4,result=result*2=4*2=8,因此,2的三次方等于8。根据这个思路给出实现代码如下: <?php /*函数功能:计算一个数d的n次方*/ function power($d,$n) { if($n==0)return 1; if($n==1)return $d; $result=1.0; if($n>0) { for($i=1;$i<=$n;$i++) { $result*=$d; } return $result; } else { for($i=1;$i<=abs($n);$i++) { $result=$result/$d; } } return $result; } printf("%0.2f<br>",power(2,3)); printf("%0.2f<br>",power(-2,3)); printf("%0.3f",power(2,-3)); ?> 程序的运行结果为 8.00 -8.00 0.125 算法性能分析:这个算法时间复杂度为O(n),需要注意的是,当n非常大的时候,这种算法的效率是非常低下的。
4. 如何快速下载一个远程HTTP服务器上的图片文件到本地?
先通过fopen()函数打开要下载的图片路径,然后使用fread()函数读取图片,再在本地打开指定存储图片的目录,将读取到的图片信息写入该目录内的文件中,即可远程下载一个图片到本地。实现代码如下: <?php $file="http://static.nipic.com/images/originalNewtip.png"; $fp=fopen($file,'rb'); $img=fread($fp,100000); $dir="./"; $local=fopen($dir.'/'.basename($file),'w'); fwrite($local,$img); ?>