问题
1. 如何访问会话变量(session)?
A.通过$_GET
B.通过$_POST
C.通过$_REQUEST
D.通过全局变量
E.以上都不对
2. 哪个函数能让服务器输出如下 header?
set-Cookie: foo=bar;
答案:_______________
3. 在忽略浏览器 bug 的正常情况下,如何用一个与先前设置的域名(domain)不同的新
域名来访问某个 cookie?
A.通过 HTTP_REMOTE_COOKIE 访问
B.不可能
C.在调用 setcookie()时设置一个不同的域名
D.向浏览器发送额外的请求
E.使用 Javascript,把 cookie 包含在 URL 中发送
4. index.php 脚本如何访问表单元素 email 的值?(双选)
A.$_GET[‘email’]
B.$_POST[‘email’]
C.$_SESSION[‘text’]
D.$_REQUEST[‘email’]
E.$_POST[‘text’]
5. 以下脚本将如何影响$s 字符串?(双选)
25
$s = '
Hello
‘;
$ss = htmlentities ($s);
echo $s;
?>
A.尖括号<>会被转换成 HTML 标记,因此字符串将变长
B.没有变化
C.在浏览器上打印该字符串时,尖括号是可见的
D.在浏览器上打印该字符串时,尖括号及其内容将被识别为 HTML 标签,因此不可
见
E.由于调用了 htmlentities(),字符串会被销毁
6. 如果不给 cookie 设置过期时间会怎么样?
A.立刻过期
B.永不过期
C.cookie 无法设置
D.在浏览器会话结束时过期
E.只在脚本没有产生服务器端 session 的情况下过期
7. 思考如下代码:如果用户在两个文本域中分别输入“php”和“great”,脚本输出什么?
echo $_GET['element'];
?>
A.什么都没有
B.Array
C.一个提示
D.phpgreat
E.greatphp
8. 在 HTTPS 下,URL 和查询字串(query string)是如何从浏览器传到 Web 服务器上的?
A.这两个是明文传输,之后的信息加密传输
B.加密传输
C.URL 明文传输,查询字串加密传输
D.URL 加密传输,查询字串明文传输
E.为确保加密,查询字串将转换为 header,夹在 POST 信息中传输
9. 当把一个有两个同名元素的表单提交给 PHP 脚本时会发生什么?
A.它们组成一个数组,存储在超级全局变量数组中
B.第二个元素的值加上第一个元素的值后,存储在超级全局变量数组中
C.第二个元素将覆盖第一个元素
D.第二个元素将自动被重命名
E.PHP 输出一个警告
10.如何把数组存储在 cookie 里?
A.给 cookie 名添加一对方括号[]
B.使用 implode 函数
C.不可能,因为有容量限制
D.使用 serialize 函数
E.给 cookie 名添加 ARRAY 关键词
11.以下脚本输出什么?
ob_start();
for ($i = 0; $i < 10; $i++) {
echo $i;
}
$output = ob_get_contents();
ob_end_clean();
echo $ouput;
?>
A.12345678910
B.1234567890
C.0123456789
D.什么都没有
E.一个提示
12.默认情况下,PHP 把会话(session)数据存储在______里。
A.文件系统
B.数据库
C.虚拟内容
D.共享内存
E.以上都不是
13.你在向某台特定的电脑中写入带有效期的 cookie 时总是会失败,而这在其他电脑上都
正常。在检查了客户端操作系统传回的时间后,你发现这台电脑上的时间和 web 服务
器上的时间基本相同。而且这台电脑在访问大部分其他网站时都没有问题。请问这会
是什么原因导致的?(双选)
A.浏览器的程序出问题了
B.客户端的时区设置不正确
C.用户的杀毒软件阻止了所有安全的 cookie
D.浏览器被设置为阻止任何 cookie
E.cookie 里使用了非法的字符
14.假设浏览器没有重启,那么在最后一次访问后的多久,会话(session)才会过期并被
回收?
A.1440 秒后
B.在 session.gc_maxlifetime 设置的时间过了后
C.除非手动删除,否则永不过期
D.除非浏览器重启,否则永不过期
E.以上都不对
15.哪个函数能把换行转换成 HTML 标签
?
答案:____________
答案
1. 尽管在 register_globals 被设置为 on 时,可以通过全局变量来访问 session,但在较新版
本的 PHP 中,为了避免造成安全隐患,php.ini 文件已经把 register_globals 设置为 off
了。因此答案是 E。
2. 虽然 header 函数在这里也能用,但这题显然是在说 setcookie 或 setrawcookie 函数。
3. 答案是 B。浏览器不允许来自某个域名的 HTTP 事务更改另一个域名下的 cookie,否
则这将造成严重的的安全问题。
4. 既然表单采用 post 方式传输,那么脚本将只可能从$_POST 和$_REQUEST 两个超级全
局变量数组中取到值。元素名称(email)是键名,因此答案是 B 和 D。注意,由于可
能导致潜在的安全问题,这里不鼓励使用$_REQUEST。
5. 本题考验你对 HTML 编码的认识以及代码查错能力。变量$s 在被函数 htmlentities()处
理过后,结果返回给了变量$ss,而$s 自己并没有被改变。因此答案是 B 和 D。你可能
觉得自己被戏弄了,但是记住,发现这样的小错误是捉虫能力中很重要的一部分。
6. 如果没有设置过期时间,cookie 将在用户会话结束时自动过期。cookie 不需要服务器
端会话的支持,因此答案是 D。
7. 表单使用 post 方式传输,所以无论在文本框中输入什么,其值都会传给$_POST 超级
全局变量,这里的$_GET 数组没有值。答案是 A。
8. HTTPS 传输发生时,浏览器与服务端立刻完成加密机制的握手,之后的数据都是加密
传输而不是明文传输——包括 URL,查询字串。而在 HTTP 传输中,它们都是明文传
输的,因此答案是 B。
9. 对于收到的查询字串和 POST 信息,PHP 只是简单的把元素添加进对应的超级变量数
组中。结果就是如果有两个元素同名,前一个会被后一个覆盖。答案是 C。
10.只有 B 永远正确。虽然你可以用 implode 函数把数组转化成字符串,然后存在数组里,
但却无法保证日后一定能用 serialize()把这个字符串还原成数组。浏览器对单个 cookie
有容量限制,因此在 cookie 里存储数组不是个好主意。但事情也并非永远是这样,你
仍然可以存储一些比较小的数组。
11.这又是一个考验 debug 能力的题。注意到了吗,在脚本的末尾,echo 语句中的$output
变量拼错了!脚本不会输出任何东西,答案是 E。
12.答案是文件系统(A)。默认情况下,PHP 把所有会话信息存储在/tmp 文件夹中;在没
有这个文件夹的操作系统中(比如 Windows),必须在 php.ini 中给 session.save_path 设
置一个合适的位置(如 c:Temp)。
13.B 和 D 是最有可能出问题并应该深入调查的地方。由于浏览器访问其他网站都正常,
所以不可能是浏览器程序出了问题。杀毒软件通常不会选择性的只阻止安全的 cookie
(不过有可能会阻止所有的 cookie)。你首先应当检查浏览器是否被设置为阻止所有
cookie,这是最有可能导致该问题的原因。同时,错误的时区设置也可能是根源——给
cookie 设置有效期时用得是 GMT 时间。可能会出现 cookie 在写入时就立刻过期,从
而无法被脚本接收的情况。
14.session.gc_maxlifetime 设置的是用户最后一次请求到 session 被回收之间的时间间隔。
尽管数据文件并没有被真正删除,不过一旦 session 被回收,你将无法对此 session 进行
访问。巧合的是,session.gc_maxlifetime 的默认设置正好是 1440 秒,但这个数字是可
以被系统管理员调整的。所以答案应该是 B。
15.函数 nl2br 能实现这个功能。
数组
PHP 最强大的功能大概就是处理数组了。PHP 允许开发者创建由各种不同数据类型的
键和值组成的数组,并允许你对它进行排序、分割和组合等多种操作。
力量越大,责任越大。找到最佳的办法来处理如此复杂的数组并不是一件轻松的事。
本章一方面考察你对数组工作机制的认识——不光是理论上的,还要求实践。另一方面考
察你“人工处理”简单脚本——指出哪里出错或者脚本将输出什么的能力。
问题
1. 索引数组的键是______,关联数组的键是______。
A.浮点,字符串
B.正数,负数
C.偶数,字符串
D.字符串,布尔值
E.整型,字符串
2. 考虑如下数组,怎样才能从数组$multi_array 中找出值 cat?
$multi_array = array("red",
"green",
42 => “blue”,
“yellow” => array(“apple”,9 => “pear”,”banana”,
“orange” => array(“dog”,”cat”,”iguana”)));
?>
A.$multi_array['yellow']['apple'][0]
B.$multi_array['blue'][0]['orange'][1]
C.$multi_array[3][3][2]
D.$multi_array['yellow']['orange']['cat']
E.$multi_array['yellow']['orange'][1]
3. 运行以下脚本后,数组$array 的内容是什么?
$array = array ('1', '1');
foreach ($array as $k => $v) {
$v = 2;
}
?>
A.array (’2′, ’2′)
B.array (’1′, ’1′)
C.array (2, 2)
D.array (Null, Null)
E.array (1, 1)
4.对数组进行升序排序并保留索引关系,应该用哪个函数?
A.ksort()
B.asort()
C.krsort()
D.sort()
E.usort()
5.哪个函数能把数组转化能字符串?
答案:____________
6. 以下脚本将按什么顺序输出数组$array 内的元素?
$array = array ('a1', 'a3', 'a5', 'a10', 'a20');
natsort ($array);
var_dump ($array);
?>
A.a1, a3, a5, a10, a20
B.a1, a20, a3, a5, a10
C.a10, a1, a20, a3, a5
D.a1, a10, a5, a20, a3
E.a1, a10, a20, a3, a5
7. 哪个函数能把下方数组的内容倒序排列(即排列为:array(‘d’, ‘c’, ‘b’, ‘a’))?(双选)
$array = array ('a', 'b', 'c', 'd');
?>
A.array_flip()
B.array_reverse()
C.sort()
D.rsort()
E.以上都不对
8. 以下脚本输出什么?
$array = array ('3' => ‘a’, ’1b’ => ‘b’, ‘c’, ‘d’);
echo ($array[1]);
?>
A.1
B.b
C.c
D.一个警告
E.a
9.哪种方法用来计算数组所有元素的总和最简便?
A.用 for 循环遍历数组
B.用 foreach 循环遍历数组
C.用 array_intersect 函数
D.用 array_sum 函数
E.用 array_count_values()
10.以下脚本输出什么?
$array = array (0.1 => ‘a’, 0.2 => ‘b’);
echo count ($array);
?>
A.1
B.2
C.0
D.什么都没有
E.0.3
11. 以下脚本输出什么?
$array = array (true => ‘a’, 1 => ‘b’);
var_dump ($aray);
?>
A.1 => ‘b’
B.True => ‘a’, 1 => ‘b’
C.0 => ‘a’, 1 => ‘b’
D.什么都没有
E.输出 NULL
12.在不考虑实际用途的前提下,把数组直接传给一个只读函数比通过引用传递的复杂度
低?
A.是的,因为在把它传递给函数时,解释器需要复制这个数组
B.是的,如果函数修改数组的内容的话
C.是的,如果这个数组很大的话
D.是的,因为 PHP 需要监视函数的输出,已确定数组是否被改变
E.不是
12. 以下脚本输出什么?
function sort_my_array ($array)
{
return sort ($array);
}
$a1 = array (3, 2, 1);
var_dump (sort_my_array (&$a1));
?>
A.NULL
B.0 => 1, 1 => 2, 2 => 3
C.一个引用错误
D.2 => 1, 1 => 2, 0 => 3
E.bool(true)
13. 以下脚本输出什么?
$result = '';
function glue ($val)
{
global $result;
$result .= $val;
}
$array = array ('a', 'b', 'c', 'd');
array_walk ($array, 'glue');
echo $result;
?>
答案:____________
15.以下脚本输出什么?
$array = array (1, 2, 3, 5, 8, 13, 21, 34, 55);
$sum = 0;
for ($i = 0; $i < 5; $i++) {
$sum += $array[$array[$i]];
}
echo $sum;
?>
A.78
B.19
C.NULL
D.5
E.0
答案
1. 键名是整型数字(integer)的数组叫索引数组,键名是字符串的数组叫关联数组。正
确答案是 E。
2. cat 被包含在另外两个数组中。顺藤摸瓜,首先,键 yellow 必须要用到,它跟在 orange
后面。最内部的数组是个索引数组,字符串 cat 是第二个值,它的索引是 1。正确答
案是 E。
3. 答案是 B。foreach 操作的是$array 的副本,因此对原来的值没有影响。
4. 只有 asort 函数能在保留原有索引关系的前提下进行排序。答案是 B。
5. serialize 函数能把复杂的数据结构转换成字符串,并可以用 unserialize 函数再转换回原
先的结构。还有 implode 函数,它可以把数组中的所有元素组成一个字符串。
6. 函数 natsort()使用“自然排序”法对数组进行排序。在本题中,数组元素已经“自然”
排列了,因此函数根本没有改变数组。答案是 A。
7. array_flip()只能把数组中每个元素的键和值进行交换。rsort()和 array_reverse()则能把题
目中的数组逆向排序为需要的形式(’d’,’c’,’b’,’a’)。答案是 B 和 D。
8. 给数组中的元素设置数字键时,PHP 从可用的最小的数字开始,递增设置。如果没有
指定从哪个数字开始,PHP 将从 0 开始。本题中,3 是第一个元素的键,因此,第三
个元素的键将被设置为 4,最后一个元素是 5。注意,1b 不是数字。因此,键是 1 的
值不存在,答案是 D。
9. array_sum 函数计算数组中所有元素的总和。答案是 D。
10. 脚本输出 1(答案是 A)。因为只有整型数字和字符串可以被用来做数组的键——浮点
数字会被转换成整型数字。所以 0.1 和 0.2 会被转换成 0,$array 中只有 0=>’b’这个元
素。
11. 这题试图把你的注意力从真正的问题上转移开。true 等同于数字 1,因此$array 数组
将只包含一个元素。然而在 var_dump()函数里出现了一个错误——$array 被错拼成了
$aray,少了一个“r”。因此 var_dump 将输出 NULL(也可能是一个提示 ,这取决于
你的设置)。答案是 E。
12. 这题有些绕人。首先,注意两点:第一,你并非一定要使用这两种方式来传递数组。
如果需要用一个函数来修改数组的内容,通过引用传递将是唯一的方法——但题中不
是这种情况;第二,题目强调把数组传递个一个只读函数。如果不是这样,由于对数
组进行改变将产生一个该数组的副本,答案会是 B。然而常规情况下,PHP 需要创建
一套结构来维持一个引用,另一方面,由于 PHP 采用懒拷贝(lazy-copy)——又叫写
时拷贝(copy-on-write)——机制,变量在被改变之前不会产生副本,所以通过引用
将数组传递给一个不修改数组内容的函数比通过值传递要慢,而通过值传递是一种快
速、安全的在函数间共用数组的方式。答案是 E。
13. 答案是 E。sort 函数不产生或返回数组副本,而是直接对传递给它的数组本体进行操
作。该函数只返回布尔值 true,代表排序成功(或者 false,代表出错)。注意,这里
将数组$a1 引用传递给了 sort_my_array(),我们不赞成这样做,应该在函数中重新声
明引用。
14. array_walk 函数将一个指定函数应用在数组中的每个元素上。因此脚本 glue 函数将把
数组中的所有元素连在一起,输出 abcd。
15. 本题主要考验你分析脚本的能力。你也许觉得这题很费解——但我们在调试别人写的
代码时却不得不经常面对此类令人不悦的问题。相对于我们所见过的一些代码,这已
经算相当简单了。脚本中的 for 循环了 5 次,每次都把键是数组$array 中键为$i 的值
的值加进$sum。这听起来有点像绕口令,但如果你一步一步想,你将发现, 当$i 等
于零时,$array[$array[$i]]等同于$array[$array[0]],也就是$array[1],也就是 2。顺着
这个思路,最终的答案是 78。
字符串与
正则表达式
字符串是 PHP 的“瑞士军刀”——作为一种 Web 开发语言,PHP 最常打交道的就是
字符串。因此对于开发者来说,处理字符串是一项非常基础的技能。
幸运的是,由于 PHP 开发团队的努力,PHP 对字符串的处理相当易学。你只需迈过第
一个难关,接下来就一马平川了。
但是,PHP 的这一部分功能并非完美。本章考验你对字符串的了理解及对处理字符串
的函数的认识。此外,你还必须面对正则表达式——一个非常有用,却总是被开发者忽试
的工具——的编写艺术。