一、选择题 5. 执行如下代码,其输出结果是______
<?php
$a=3;
$b=4;
$c=$a<2&&$b++;
echo$b;
?>
A B C D
A
[解析] 因为$a=3,大于2,所以$a<2不成立,“&&”运算符具有短路的特性,也就是说,在从左向右判断的时候一旦发现一个条件为假就直接返回false,而不会继续判断后面的条件,因为后面的判断已经没有意义了。在本题中,由于“&&”的第一个条件为假,此时就不再判断第二个条件直接返回假,所以$b++没有执行,最终$b的值还是4。选项A正确。 所以,本题的答案为A。
9. 下列代码的输出结果是______
<?php
class A{
public function__construct(){
echo"Class A...<br/>";
}
}
class B extends A{
public function__construct(){
echo"Class B...<br/>";
}
}
new B();
?>
A.Class B... B.Class A...Class B... C.Class B...Class A... D.Class A...
A B C D
A
[解析] 在PHP中,如果子类定义__construct,则会覆盖父类的__construct,如果没有定义__construct,则会使用父类的,可以在子类的__construct中显式调用父类的构造函数,方法如下:parent::__construct();。本题中,由于只实例化了子类的对象,因此只会调用子类的构造函数。选项A正确。 所以,本题的答案为A。
二、填空题 1. 同时满足这样条件的数:被10除余9,被9除余8,被8除余7,在100~1000之间,有______个。
2个。
[解析] 假设要求解的数为P,分析过程如下: P除以10余9,可知P+1能被10整除; P除以9余8,可知P+1能被9整除; P除以8余7,可知P+1能被8整除; 所以P=(8,9,10的公倍数)-1; 8=2*2*2,9=3*3,10=2*5: 则P+1一定是2*2*2*3*3*5的倍数(只能约掉一个2); 又100≤P≤1000; 101≤P+1≤1001; 所以P+1=360,720; 即P=359,719; 由分析可知,有两个这样的数存在,分别是359和719。
2. ______函数能把数组转化能字符串。
implode()。
[解析] 使用的代码如下: <?php $arr=array('I','Love','You'); echo implode(" ",$arr); ?> 程序的运行结果为I Love You。
3. 有一个字符串变量$String,去除其中的HTML标记的正则表达式为______。
$result=preg_replace("/<∨?[^<>]*?>/","",$String);。
4. 事务必须满足______、______、______、______四个属性。
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),即ACID四种属性。
5. Memcache最大能存储的单个item为多大?______。
1MB。
[解析] Memcache存储的单个最大数据为1MB,如果数据大于1MB,那么可以考虑将数据进行拆分存储到不同的key中。
三、简答题 1. 请写出MVC的优点。
1)可以为一个模型在运行时建立和使用多个视图。变化传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 2)视图与控制器的可接插性。允许更换视图和控制器对象,而且可以根据需求动态地打开或关闭,甚至在运行期间进行对象替换。 3)模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作,需要做的只是在新平台上对视图和控制器进行修改。 4)潜在的框架结构。可以基于此模型建立应用程序框架,不只是用在设计界面中。
2. “===”是什么?试举一个“==”是真但“===”是假的例子。
“===”表示的是全等运算符,要求两个变量比较时,不仅是值相等,而且还要求它们的数据类型也要相同,只有待比较的两个变量的类型相同且有相同的值,比较结果才是true。“==”表示的是相等运算符,要求两个变量的值相等即可,即使不是相同的数据类型也可以认为它们相等并返回true,如果值不相等,那么返回false,因为它们存在类型的判断区别,所以只要值相等、类型不相等它们就会返回不同的结果。例如,“0”和0比较,用“==”比较时返回true,但是用“===”比较时,因为它们数据类型不一样,所以返回false。
3. 什么是局部变量和全局变量?函数内是否可以直接调用全局变量?
局部变量指的是在函数内部定义的变量,其只能在函数内使用。如果函数外存在一个与局部变量名字相同的变量,那么程序会认为它们是两个完全不同的变量。函数外的变量是一个全局变量,与函数内的变量互不影响,函数执行完毕后,函数内的局部变量会被 全局变量是在所有函数外定义的变量,其作用域是整个源文件,并且在函数内部是无法使用全局变量的。如果用户需要在函数内使用全局变量,那么在函数内使用关键字global声明局部变量为全局变量,就可以在函数内使用全局变量了。除了可以在函数内使用关键字global获取全局变量外,还可以在函数内使用$GLOBALS['var']获取对应的全局变量的值。
4. Session的原理是什么?大型网站中,使用Session应注意什么?
Session用来标识服务器与浏览器的一次会话过程,服务器会给每个Session分配一个唯一的会话ID(SID)。SID可以看作与任意数量的数据有关联,在HTTP无状态行为下,可以通过两种方式实现: 1)通过Cookie存储SID并在必要时获取SID,在页面中使用和SID相关的各项数据,即使会话结束了,Cookie也可以在客户端保存,并在后续会话中读取使用。 2)URL重写,在每个请求页面的本地URL上增加SID。无论客户什么时候点击这些链接,都会通过SID自动传播,这样即使客户端禁用Cookie,也不影响会话处理功能,可以正常使用;但是这种方法也存在一些问题,例如,URL重写在会话之间不能保持持久性,也无法阻止用户将URL分享给别人。 在大型网站中,因为访问量比较大,所以应用服务器一般都会做集群部署,Session是存储在每个服务器中的,这时需要注意实现各个服务器之间的Session共享。
5. 请写出面向对象中接口和抽象类的区别及应用场景。
1)被abstract修饰的类叫作抽象类,抽象类可以没有抽象方法,但是一个类如果存在抽象方法,那么这个类一定是抽象类。抽象方法必须使用abstract关键字修饰。 2)接口中全部是抽象方法,方法不需要用abstract定义。 3)当多个同类的类要设计一个上层时,通常设计为抽象类,当多个异构的类要设计一个上层时,通常设计为接口。
四、编程题 1. 默认情况下,Session在浏览器关闭时将失效,如果要延长Session的生存周期(比如一个月),那么如何处理?
要延长Session的生存周期方法有下面两种: 1)通过setcookie()设置。语法为setcookie(Cookie名称、Cookie值、Cookie有效期(可选),Cookie服务端路径(可选),Cookie域名(可选),是否通过安全的HTTPS连接传输Cookie(可选)),因为session_id是存在Cookie里的,通过延长session_id的生存周期,可以延长客户端带着session_id访问服务端的Session。实现代码如下: <?php session_start(); $time=24*3600*30; setcookie(session_name(),session_id),time()+$time,"/"); ?> 2)通过Session提供的session_set_cookie_params()函数。该函数通过设置Cookie的生命周期,延长Cookie存储SessionID的时间,从而延长了访问Session的生存期,但该函数须在session_start()前调用。实现代码如下: <?php $time=24*3600*30; session_set_cookie_params($time); session_start(); ?>
2. 请写一个函数,实现以下功能:字符串“open door‘”转换成“OpenDoor”、“make_by_id”转换成“MakeById”。
从题目可以看出,源字符串中单词通过“_”分割的,转换后的字符串,从第二个单词开始首字母都大写。通过这个规律可以有下面几种实现方式。 方法一:将字符串按“_”分割为数组,然后按照空格合并为字符串,使用ucwords函数将字符串首字母转换为大写,同时再次调用implode函数合并为字符串。 function str_explode($str){ $str_arr=explode("_",$str); $str_implode=implode("",$str_arr); $str_implode=implode("",explode("",ucwords($str_implode))); return $str_implode; } $strexplode=str_explode("make_by_id"); print_r($strexplode); 方法二:将字符串按“_”分割为数组,对分割后的数组进行循环调用ucwords函数将字符串首字母转换为大写。 function str_explode($str){ $result=""; $expStr=explode("_",$str); for($i=0;$i<count($expStr);$i++) { $result=$result.ucwords($expStr[$i]); } return $result; } $str="make_by_id"; $result=str_explode($str); echo $result; 方法三:将字符串中“_”替换为空格,调用ucwords函数将字符串首字母转换为大写,最后替换掉空格。 echo str_replace('',",ucwords(str_replace('_','','open_door')));
3. 写出一个能创建多级目录的函数。
<?php function create_dir($paht,$mode=077){ if(is_dir($path)){ echo "folder exists"; }else{ if(mkdir($path,$mode,true)){ echo "create success"; }else{ echo "create failed"; } } } ?>
4. 如何实现旋转数组功能?
先分别把两个子数组的内容交换,然后把整个数组的内容交换,即可得到问题的解。 以数组x1=array(1,2,3,4,5)与数组x2=array(6,7,8,9)为例,交换两个数组后,x1=array(5,4,3,2,1),x2=array(9,8,7,6),即x=array(5,4,3,2,1,9,8,7,6)。交换整个数组后,x=array(6,7,8,9,1,2,3,4,5)。 示例代码如下: <?php function swap(&$arr,$low,$high) { //交换数组low到high的内容 for($i=0;$low<$high;$low++,$high--) { $tmp=$arr[$low]; $arr[$low]=$arr[$high]; $arr[$high]=$tmp; } } function rotatearr(&$arr,$len,$div) { if(!$arr||$len<1||$div<0||$div>=$len) { printf("参数不合法\n"); return; } //不需要旋转 if($div==0||$div==$len-1) return; //交换第一个子数组的内容 swap($arr,0,$div); //交换第二个子数组的内容 swap($arr,$div+1,$len-1); //交换整个数组的元素 swap($arr,0,$len-1); } $arr=array(1,2,3,4,5); $length=count($arr); rotatearr($arr,$length,2); for($i=0;$i<$length;$i++) printf("%d",$arr[$i]); ?> 程序的运行结果为 4 5 1 2 3