[连载][Zend权威认证试题讲解]第一章-PHP编程基础
时间:2008-02-15
来源:互联网
你必须有一定的经验才能完成这套ZEND测试题。这并不意味着你必须是超级高手――很简单,为了通过这套测试,你只需在日常生活有足够的接触PHP的时间。
因此,了解自己对“基础”的掌握程度非常重要。尽管这些知识非常“底层”,但却是PHP永恒的基本元素。没有回答好本套测试其他章节的题目可能只是说明那些问题并不是你日常PHP编程中经常接触的部分;但如果在本章就做错大量的题目,你就要警惕了。总之,如果你基础薄弱,就会影响你对进阶知识的理解。
问题
1. 选择合适的答案填入空白处
PHP是一种______脚本语言,基于______引擎。PHP最常被用来开发动态的______内容,此外,它同样还可被用来生成______(以及其他)文档。
A.动态,PHP,数据库,HTML
B.嵌入式,Zend,HTML,XML
C.基于Perl的,PHP,Web,静态
D.嵌入式,Zend,Docbook文档,MySQL
E.基于Zend的,PHP,图像,HTML
2.以下哪种标签不是PHP起始/结束符?
A.<% %>
B.<? ?>
C.<?= ?>
D.<! !>
E.<?php ?>
3.以下代码哪个不符合PHP语法?
A.$_10
B.${“MyVar”}
C.&$something
D.$10_somethings
E.$aVaR
4.运行以下代码将显示什么?
PHP代码:
<?php
define(myvalue, "10");
$myarray[10] = "Dog";
$myarray[] = "Human";
$myarray['myvalue'] = "Cat";
$myarray["Dog"] = "Cat";
print "The value is: ";
print $myarray[myvalue]."\n";
?>
B.The Value is: Cat
C.The Value is: Human
D.The Value is: 10
E.Dog
5. print()和echo()有什么区别?
A.print()能作为表达式的一部分,echo()不能
B.echo()能作为表达式的一部分,print()不能
C.echo()能在CLI(命令行)版本的PHP中使用,print()不能
D.print()能在CLI(命令行)版本的PHP中使用,echo()不能
E.没有区别:两个函数都打印文本!
6.以下脚本输出什么?
PHP代码:
<?php
$a = 10;
$b = 20;
$c = 4;
$d = 8;
$e = 1.0;
$f = $c + $d * 2;
$g = $f % 20;
$h = $b - $a + $c + 2;
$i = $h << $c;
$j = $i * $e;
print $j;
?>
B.42
C.242.0
D.256
E.342
7.如何给变量$a,$b和$c赋值才能使以下脚本显示字符串“Hello, World!”?
PHP代码:
<?php
$string = "Hello, World!";
$a = ?;
$b = ?;
$c = ?;
if($a) {
if($b && !$c) {
echo "Goodbye Cruel World!";
} else if(!$b && !$c) {
echo "Nothing here";
}
}
else {
if(!$b) {
if(!$a && (!$b && $c)) {
echo "Hello, World!";
} else {
echo "Goodbye World!";
}
} else {
echo "Not quite.";
}
}
?>
B.True, True, False
C.False, True, True
D.False, False, True
E.True, True, True
8.以下脚本输出什么?
PHP代码:
<?php
$array = '0123456789ABCDEFG';
$s = '';
for ($i = 1; $i < 50; $i++) {
$s .= $array[rand(0,strlen ($array) - 1)];
}
echo $s;
?>
B.49个相同字符组成的字符串,因为没有初始化随机数生成器
C.49个随机字符组成的字符串
D.什么都没有,因为$array不是数组
E.49个字母‘G’组成的字符串
9.哪种语句结构用来表现以下条件判断最合适?
PHP代码:
<?php
if($a == 'a') {
somefunction();
} else if ($a == 'b') {
anotherfunction();
} else if ($a == 'c') {
dosomething();
} else {
donothing();
}
?>
B.一个递归函数
C.while语句
D.无法用别的形式表现该逻辑
E.有default的switch语句
10.要修改每个元素的值,如何遍历$myarray数组最合适?
PHP代码:
<?php
$myarray = array ("My String","Another String","Hi, Mom!");
?>
B.用foreach循环
C.用while循环
D.用do…while循环
E.办不到!
11.考虑如下代码片段:
PHP代码:
<?php
define("STOP_AT", 1024);
$result = array();
/* 在此处填入代码 */
{
$result[] = $idx;
}
print_r($result);
?>
Array
{
[0] => 1
[1] => 2
[2] => 4
[3] => 8
[4] => 16
[5] => 32
[6] => 64
[7] => 128
[8] => 256
[9] => 512
}
A.foreach($result as $key => $val)
B.while($idx *= 2)
C.for($idx = 1; $idx < STOP_AT; $idx *= 2)
D.for($idx *= 2; STOP_AT >= $idx; $idx = 0)
E.while($idx < STOP_AT) do $idx *= 2
12.为用户定义函数is_leap()选择一个合适的函数声明。is_leap使用2000作为默认年份。
PHP代码:
<?php
/* 函数声明处 */
{
$is_leap = (!($year %4) && (($year % 100) ||
!($year % 400)));
return $is_leap;
}
var_dump(is_leap(1987)); /* Displays false */
var_dump(is_leap()); /* Displays true */
?>
B.is_leap($year default 2000)
C.function is_leap($year default 2000)
D.function is_leap($year)
E.function is_leap(2000 = $year)
13.运行以下代码将显示什么值?假设代码运行时的URL是:testscript.php?c=25
PHP代码:
<?php
function process($c, $d = 25)
{
global $e;
$retval = $c + $d - $_GET['c'] - $e;
return $retval;
}
$e = 10;
echo process(5);
?>
B.-5
C.10
D.5
E.0
14.考虑如下代码:
PHP代码:
<?php
function myfunction($a, $b = true)
{
if($a && !$b) {
echo "Hello, World!\n";
}
}
$s = array(0 => "my",
1 => "call",
2 => '$function',
3 => ' ',
4 => "function",
5 => '$a',
6 => '$b',
7 => 'a',
8 => 'b',
9 => '');
$a = true;
$b = false;
/* Group A */
$name = $s[?].$s[?].$s[?].$s[?].$s[?].$s[?];
/* Group B */
$name(${$s[?]}, ${$s[?]});
?>
A.Group A: 4,3,0,4,9,9 Group B: 7,8
B.Group A: 1,3,0,4,9,9 Group B: 7,6
C.Group A: 1,3,2,3,0,4 Group B: 5,8
D.Group A: 0,4,9,9,9,9 Group B: 7,8
E.Group A: 4,3,0,4,9,9 Group B: 7,8
15.运行时(run-time)包含一个PHP脚本使用______,而编译时(compile-time)包含一个PHP脚本使用______。
A.include_once, include
B.require, include
C.require_once, include
D.include, require
E.以上皆可
16.什么情况下声明函数时不能给参数赋默认值?
A.当参数是布尔值时
B.当函数是类中的成员时
C.当参数是通过引用传递时
D.当函数只有一个参数时
E.永远不会
17.______操作符在两个操作数中有一个(不是全部)为True时返回True。
答案:____________
18.全等运算符===如何比较两个值?
A.把它们转换成相同的数据类型再比较转换后的值
B.只在两者的数据类型和值都相同时才返回True
C.如果两个值是字符串,则进行词汇比较
D.基于strcmp函数进行比较
E.把两个值都转换成字符串再比较
19.以下哪个选项是把整型变量$a的值乘以4?(双选)
A.$a *= pow (2, 2);
B.$a >>= 2;
C.$a <<= 2;
D.$a += $a + $a;
E.一个都不对
20.一段脚本如何才算彻底终止?
A.当调用exit()时
B.当执行到文件结尾时
C.当PHP崩溃时
D.当Apache由于系统故障而终止时
答案速查
1.B
2.D
3.D
4.A
5.A
6.D
7.D
8.C
9.E
10.A
11.C
12.A
13.B
14.D
15.E
16.C
17.xor
18.B
19.AC
20.A
答案详解
1.唯一有意义的答案是B。PHP是一种基于Zend引擎的脚本语言,它通常被嵌入在HTML代码中。它主要被用来开发HTML文档,但是也可以用它来开发其他类型的文档,比如XML。
2.PHP编程中,人们不太使用<% %>和<? ?>两个标签,但它们确实是合法的PHP界定符。<! !>标签是非法的,因此正确的答案是D。记住,根据php.ini文件中的配置不同,这当中的某些标签无法在特定的情况下使用。
3.PHP变量以一个美元符号为开头,后面跟上任意数量的数字、字母和下划线。${“MyVar”}是一个合法的变量名,它使用的是较松散的命名约定。&$something是对$something的引用。然而,变量名不能以数字为开头,$10_somethings是非法的,因此答案是D。
4.注意,$myarray的键值并没有打上引号。所以,正在访问的键不是myvalue字符串,而是常量myvalue的值。最终访问的是$myarray[10],值是Dog,答案是A。
5.尽管print()和echo()在绝大多数情况下可以互换使用,但它们之间还是有一处不同。print()是函数,有返回值;echo()实际上是一个语言结构,没有返回值,并且不能在表达式中使用。因此,答案是A。
6.%运算符表示取模,它返回两个操作数相除的余数。<<是左移运算符,相当于乘以2的N次方。最后的答案乘以了一个浮点数,改变了它的数据类型。但是,由于小数点后是零,因此输出的结果不包含小数部分。答案是256(D)。
7.根据条件式的逻辑,要想得到Hello, World!字符串,必须要在第一个if结构中满足else的条件。因此$a必须为False,然后$b也必须为False。最内层的条件语句的实现要求先前的两个变量($a和$b)是False,而$c必须是True(答案是D)。
8.正确答案是C。从PHP4.2.0开始,除非已经给定了一个伪随机整数列,否则不再需要用srand()函数初始化随机数生成器。此外,即使随机数生成器没有被事先播种,脚本仍然会生成49个伪随机字符。尽管$array变量是字符串,但可以用访问数组的方式进行访问――使用数字索引访问某个位置上的字符。最后,for循环将从1开始执行到50,也就是执行了49次。
9.用一系列的if…else语句来检查一个条件的代码块,最适合用switch语句来替代。
PHP代码:
<?php
switch($a) {
case 'a':
somefunction();
break;
case 'b':
anotherfunction();
break;
case 'c':
dosomething();
break;
default:
donothing();
}
?>
10.通常情况下,foreach语句是遍历数组的首选。但是,由于foreach语句是在数组的副本上进行操作,而我们需要给数组中每个元素重新赋值,所以在这里foreach就不适用了。尽管也可以用while循环和do…while循环,但由于数组是顺序索引的,最合适的语句还是for语句。因此答案是A。
PHP代码:
<?php
$myarray = array ("My String", "Another String", "Hi, Mom!");
for($i = 0; $i < count($myarray); $i++)
{
$myarray[$i] .= " ($i)";
}
?>
for(<初始化>;<继续执行,直到>;<重复执行>)
<初始化>在循环开始时执行一次,然后for循环开始执行大括号内的代码,直到<继续执行,直到>的值为False。每完成一次循环,执行一次<重复执行>。因此,正确的代码块应该是:
for ($idx = 1; $idx < STOP_AT; $idx *= 2)
答案是C。
12.5个选项中,只有两个是合法的PHP函数声明(A和D)。在这两个选项中,只有一个设置了参数的默认值――答案是A。
13.本题考察PHP中变量作用域的相关知识。你必须明确global关键字是如何将变量引入本地域的,以及$_GET、$_POST、$_COOKIE、$_REQUEST等超级全局变量的作用域。本题中,最终的数学表达式是5+25-25-10,等于-5,答案是B。
14.函数能被以一个包含着函数名的变量后面加上括号(以及必要的参数)的形式动态调用。对于Group A来说,合适的索引组合是0,4,9,9,9,9,产生字符串myfunction。另一方面,参数将使用${}结构的可变变量。对Group B来说,合适的索引应该是7和8,等于${‘a’}$和{‘b’}――即$a和$b。因此答案是D。
15.在较新版本的PHP中,require(或requier_once())和include()(或include_once())只有一个区别――如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执行;而后者只会产生一个警告。因此答案E正确。
16.当参数被声明为通过引用传递时,你不能给它赋默认值,此时解释器期望获得一个能在函数内部进行修改的变量。答案是C。
17.正确答案是逻辑异或(xor)运算符。
18.全等运算符比较两个操作数的数据类型和值,两者中有一个不同,都会返回False。因此答案是B。
19.答案是A和C。A选项中,pow函数计算2的平方,答案是4。C选项中,左移运算符将$a的值左移两位,相当于乘以4。
20.答案是A。一段脚本并不会在执行到文件末尾时终止,所以当前文件才能被其他脚本包含。至于PHP和Apache崩溃,这两个说法就太恶搞了。
[ 本帖最后由 Ven 于 2008-2-15 00:45 编辑 ]
作者: Ven 发布时间: 2008-02-15
PHP5在对象的处理方面做了很多改变,你或许会因此更倾向于完全忽略PHP4。但事实上,许多用OOP的程序员从很早以前就开始用老版本的PHP编写软件了。所以,大量的OOP代码早已存在,甚至在人们跳到PHP5上进行开发之前。
本章不仅考察你对面向对象知识的总体掌握,还包括对PHP4特有的OOP实现机制的认识。
预定于2008年2月23日更新。
[ 本帖最后由 Ven 于 2008-2-15 16:52 编辑 ]
作者: 逆雪寒 发布时间: 2008-02-15
做完错了不少....


作者: Ven 发布时间: 2008-02-15

作者: renwl 发布时间: 2008-02-15

作者: 小星 发布时间: 2008-02-15


作者: linvo 发布时间: 2008-02-15
作者: strongability 发布时间: 2008-02-15

作者: feng123 发布时间: 2008-02-15


作者: kinomn 发布时间: 2008-02-15

质疑第10题, foreach是对数组元素副本进行操作, 但是就这么判定for在这种情况下最合适有点牵强吧?
for...
PHP代码:
<?php
$myarray = array ("My String", "Another String", "Hi, Mom!");
for($i = 0; $i < count($myarray); $i++)
{
$myarray[$i] .= " ($i)";
}
?>
PHP代码:
<?php
$myarray = array ("My String", "Another String", "Hi, Mom!");
$i = 0;
foreach ($myarray as $k->$v) {
$myarray[$k] = $i;
$i++;
}
作者: luzhou 发布时间: 2008-02-16
打了57.5分,还没及格!寒。。。
作者: zwws 发布时间: 2008-02-16

作者: 奇将射天狼 发布时间: 2008-02-16
foreach比for多一步额外的操作――复制数组元素,因此效率自然不如for。
而for循环体内只有1行代码,foreach时却有2行(加上循环之前初始化$i的那行,总共比for多出了2行),从代码的简洁上看也是for获胜(这也同样是for打败while和do...while的原因)。
作者: luzhou 发布时间: 2008-02-16
实际运用就不会有这种情况吧?
例如转义$_GET数组内各个元素...
BTW: 我没死脑筋吧?

作者: Ven 发布时间: 2008-02-16
[ 本帖最后由 Ven 于 2008-2-16 12:52 编辑 ]
作者: zwws 发布时间: 2008-02-16
作者: Ven 发布时间: 2008-02-16
作者: fising 发布时间: 2008-02-16

作者: zwws 发布时间: 2008-02-17


作者: linvo 发布时间: 2008-02-17
作者: zwws 发布时间: 2008-02-17

作者: naodai 发布时间: 2008-02-17

作者: linvo 发布时间: 2008-02-17
作者: luzhou 发布时间: 2008-02-19
作者: sonyhhhhh 发布时间: 2008-02-19
错了两道半啊。
第六、十、十九(选对了一个A)。
很好,很强大。
从几个做错的题目确实能够反映出在“<<”类似操作上的弱项。哈哈
作者: shimch 发布时间: 2008-02-19

作者: enze 发布时间: 2008-02-19
作者: php? 发布时间: 2008-02-21
作者: netstudy 发布时间: 2008-02-29
引用:
原帖由 Ven 于 2008-2-16 11:18 发表我是这样想的:
foreach比for多一步额外的操作――复制数组元素,因此效率自然不如for。
而for循环体内只有1行代码,foreach时却有2行(加上循环之前初始化$i的那行,总共比for多出了2行),从代码的简洁上看也是f ...
引用:
原帖由 Ven 于 2008-2-16 12:43 发表题目里给的就是一个索引数组,你想得已经超出题目要求了。
如果按照题意只需要改变内容那用 foreach 不需要用 $i 记数的,随便写个什么改变一下数组元素的值就可以了。
PHP代码:
<?php
$myarray = array ("My String", "Another String", "Hi, Mom!");
foreach ($myarray as $k => $v) {
$myarray[$k] = 1;
}
?>
引用:
原帖由 Ven 于 2008-2-16 11:18 发表我是这样想的:
foreach比for多一步额外的操作――复制数组元素,因此效率自然不如for。 ...
我实际测试了一下,如果这两段出现在同一个 php 文件中,在前面的耗时长一些,但是相对来说还是 foreach 独立运行时比 for 独立运行时耗时少。
我的测试代码如下:
PHP代码:
<?
/* global function ----------------------------------------------------*/
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
/* foreach ----------------------------------------------------*/
$myarray1 = array ("My String", "Another String", "Hi, Mom!");
$timestart1 = microtime_float();
foreach($myarray1 as $k => $v) {
$myarray1[$k] .= 1;
}
$timeend1 = microtime_float();
echo "\nforeach: ", $timeend1 , ' - ' , $timestart1, ' = ', $timeend1 - $timestart1;
/* --------------------------------------------------------------------*/
?>
PHP代码:
<?
/* global function ----------------------------------------------------*/
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
/* for ----------------------------------------------------*/
$myarray2 = array ("My String", "Another String", "Hi, Mom!");
$timestart2 = microtime_float();
for($i = 0; $i < count($myarray2); $i ++) {
$myarray2[$i] .= 1;
}
$timeend2 = microtime_float();
echo "\nfor: ", $timeend2 , ' - ' , $timestart2, ' = ', $timeend2 - $timestart2;
/* --------------------------------------------------------------------*/
?>
[ 本帖最后由 ☆侠客☆ 于 2008-2-29 15:34 编辑 ]
作者: ☆侠客☆ 发布时间: 2008-02-29
只是因为你把 count 语句写在了 for 循环的条件里面 ...
导致每循环一次都要重新计算一次数组大小 ... 这样是不公平的哦 ...
附上我的比较代码 ... 用到了 eval 所以得出来的运行时间并不精确 ...
仅适用于比较两个执行时间的长短 ...
PHP代码:
<?php
$for = array(
'name' => 'for',
'before' => '$myarray2 = array ("My String", "Another String", "Hi, Mom!"); $sizeof = count($myarray2);',
'body' => 'for($i = 0; $i < $sizeof; $i ++) { $myarray2[$i] .= 1; }',
'after' => false,
);
$foreach = array(
'name' => 'foreach',
'before' => '$myarray1 = array ("My String", "Another String", "Hi, Mom!");',
'body' => 'foreach( $myarray1 as $key => $value ) { $myarray1[$key] .= 1; }',
'after' => false,
);
Tester::$loops = 1000;
Tester::Start( $foreach );
Tester::Start( $for );
class Tester {
static private $start_at;
static public $loops;
static private function Ticker( $name) {
$mtime = explode ( ' ', microtime() );
if ( ! self::$start_at ) self::$start_at = $mtime[1] + $mtime[0];
else {
$total = $mtime[1] + $mtime[0] - self::$start_at;
echo '[ ', $name, ' : ', round($total , 5 ), ' sec. ]';
self::$start_at = '';
}
return;
}
static public function Start( $parameter ) {
$execution = $parameter['body'];
$_loops = self::$loops;
eval( $parameter['before'] );
self::Ticker( '' );
for ( $_loop = 0; $_loop < $_loops; $_loop++ )
eval( $parameter['body'] );
self::Ticker( $parameter['name'] );
eval( $parameter['after'] );
}
}
?>
作者: ☆侠客☆ 发布时间: 2008-02-29

这段代码让我知道了区分在一些情况下应该用 for 还是 foreach ,thanks。

[ 本帖最后由 ☆侠客☆ 于 2008-3-1 16:22 编辑 ]
作者: Sunyanzi 发布时间: 2008-03-01
$myarray = array ("My String", "Another String", "Hi, Mom!");
$i = 0;
foreach ($myarray as $key) {
$myarray[$key] = $i;
$i++;
}
?>
作者: ☆侠客☆ 发布时间: 2008-03-17
作者: tanghez123 发布时间: 2008-03-20
PHP代码:
<?php
$myarray = array ("My String","Another String","Hi, Mom!");
foreach($myarray as &$value)
{
$value .= "***";
}
print_r($myarray);
?>
作者: lucas1860 发布时间: 2008-04-02
作者: ecchanger 发布时间: 2008-04-16

[ 本帖最后由 wangyi6854 于 2008-4-19 10:15 编辑 ]
作者: tran99 发布时间: 2008-04-19

薯年美食总动员
作者: wangyi6854 发布时间: 2008-04-28

作者: jingangel 发布时间: 2008-04-29
引用:
原帖由 wangyi6854 于 2008-4-19 10:14 发表看到第一题就头痛,本人最痛恨的题目就是这种类型的。填什么不行啊?非得和出题的那个家伙要想的一样。


作者: jingangel 发布时间: 2008-04-29
作者: Ven 发布时间: 2008-04-29

作者: libaiyi 发布时间: 2008-04-30
代码:
<?php$myarray = array ("My String", "Another String", "Hi, Mom!");
for(reset($myarray);$key=key($myarray);next($myarray))
{
$myarray[$key] .= " ($key)";
}
?>
我也觉得用for比较合适,但是我会这么写,或者按照楼主的那个方式,但是要把count提取出来
作者: Ven 发布时间: 2008-04-30
引用:
原帖由 ☆侠客☆ 于 2008-3-1 16:18 发表嗯,执行 1000 次应该比我执行 1 次要准确多了,执行了你的代码并且逐渐加大了执行次数,发现在 1000 次时,执行初期 foreach 比 for 要快([ foreach : 0.01971 sec. ][ for : 0.02153 sec. ]),但是随着执行次数增 ...
代码:
foreach($array as $key => $value)foreach会不停的给$key和$value赋新值,而使用while循环一维数组的时候,仅仅需要引入一个小小的变量,使用for(reset($array);$key=key($array);next($array))也只需要对索引进行循环负值。
作者: fhjr999 发布时间: 2008-04-30
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28