杂记6

  1. 进制运算

可以是让他模拟一些简单的字符串函数,类似 bin2hex、base_convert、base64_encode,或者单纯的,让他手动算一下 7 进制的 54321 显示为 9 进制是多少。

应该高中或者之前就能接触到 2 进制 10 进制之间的换算了吧,当然,他当时很可能没听懂。通常的情况,如果以前没留意这个问题但有理解能力的,可能能在几分钟的做出一些成功不成功的尝试。至少不应该很茫然。最糟糕的情况,连整数的最大值是多少都不知道,那就算了。

  1. 描述一下常见的关于读取文件内容的操作,及各自的特点

应该不用迟疑太久就把 file、fopen、file_get_contents、readfile 列出来。表现好点还可以提下 readfile 的流式读取不占内存之类的。如果看的教材太老,可能只会说 fopen。最糟糕的辩解是不说跟数据库打交道比较多,文件操作没怎么接触过,完全无视文件静态化的存在。

  1. 怎么模拟一个 POST 表单提交

答 socket 或者 cURL 都可以。

  1. 列举一些常规优化方式

正确索引(就不强求完全理解多列索引了,最好能知道每个查询只能用到一个索引),知道索引提高查询速度、降低插入速度。正确的字段类型(能知道 char 和 varchar 的区别和优缺点)。text 类字段可以单放一个表用主键关联。总之他能说的越多越好。顺便问问他他所知道的最大处理能力是每秒多少条,哪怕是测试环境里的 benchmarking(今天看到份简历,号称三年工作经验,将半个月三万条插入形容为他所遇到的最高的负载,写在简历的醒目位置)。

  1. “你知道,把时间存在数据库里有两种方法,一种是用时间戳,就是 PHP 函数 time() 产生的那种整数,另一种是 MySQL 里字段类型设成 datetime。那么,为什么一定要后一种方式?”

最简单的一个例子,如果存的是时间戳,你无法按类似“所有周三的数据”这种方式显示内容。这表明了他的学习阶段:是否接触了类似日志分析类的东西。因为这些是早晚都要接触到的。

  1. 简单联表查询

有这么两个表

user 表:
id name
1 张三
2 李四
3 王五
4 赵六

apple 表:

id user number
1 1 5
2 3 3
3 1 8
4 4 6
5 3 2
6 4 2

apple 表的 user 字段跟 user 表的 id 对应,一条 SQL 语句查出每个人都有多少苹果

如果他不知道 join,可能会这么写

SELECT user.name, SUM(apple.number) FROM user, apple WHERE user.id = apple.user GROUP BY user.id

正确答案应该是这样

SELECT user.name, SUM(apple.number) FROM user LEFT JOIN apple ON user.id = apple.user GROUP BY id

这两条语句的差别是,不用 join 无法显示出李四有 0 个苹果 -_-

  1. 假设我们要做一个公交系统的常见服务,就是做查公交车怎么倒车的。假设完全由你自己来搞,我只关心最后结果,你会怎么做这个项目。说的越详细越好。

可能需要不断提示。考查一个人的做事能力,比方说他首先会想到需要数据,数据库应该怎么设计,有几个表,什么样的字段。
可以加分的地方可以有这么几个点。给站名编 id,匹配数字的速度要远大于匹配字符串。站点之间要距离的数据,这样计算最优倒车路线应该能考虑到站数,倒车次数、距离等权值。如果很有远见,任意两点之间的数据应该是提前算好的,比方说有 200 条公交线路和 2000 个站点,始发终点的组合可能是 2000 * 1000,每种线路可能有 1 - 6 种方案,有个表是来装这近一千万行结果的,如果有线路变化,再用本地的机器重新算一遍线路。这样整个系统才有实用价值。不然可能每次查询都需要耗费数秒或者更长时间,只能当单机软件用。

这些题本身是交流的话题,而不是“做对 5 道以上我就招你”这种门槛。我面试时每道题都会给予充分的时间,如果他做不上来,也起码能判断他的思考方式,而忌讳说“如果你不知道就明说,咱们赶紧做下一题”。同时也能观察出性格等方面。比方说第 6 题,有人把 SUM 写成 COUNT,我就问他你看看前面写的是否有问题,同时又怕太明显,又补充一句“也可能什么错误也没有、我在误导你,你自己判断”,于是他就不再理会、继续接着写完整个 SQL。再综合他的其他一些表现,我的结论是此人主见极强的,我不会用。属于出了 BUG 第一念头是 BUG 在解释器上、做出来的程序跟产品需求不符时会说是你产品没说明白的那种。相反,我很欣赏那些在做完第一道题的 7 进制转换后还知道验算的,因为既然是笔算就很容易出错。我觉得这种人思考严谨、负责任。

其他的一些知识,比方说 memcache、SVN、单元测试这些,都属于经验问题,应届生很少需要接触到这些东西(甚至文件静态化也很少碰到),不像上面,我需要以此来判断面试者对编程是否已经入门。

还是在 ngacn 上看到的一句话,团队需要两种人,要么 NB 的,要么听话的。

一、PHP基础
题目1:表单中 get与post提交方法的区别?
题目2:在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?);
题目3:session与cookie的区别?
题目4:如何用php的环境变量得到一个网页地址的内容?ip地址又要怎样得到?
题目5:语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是(?);为了避免多次包含同一文件,可以用语句(?)来代替它们。
题目6:类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(?)。

二、PHP进阶
题目1、请说明在php.ini中safe_mode开启之后对于PHP系统函数的影响?
题目2:你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?
题目3:请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
三、考察项目理解能力
问题1:请谈谈你对IT项目开发实施的理解,以及自己如何这个过程中把工作做得最好?
四、考察需求详细设计能力
问题1:请谈谈你对什么是需求,什么是需求设计工作的理解?并简单举例,一个现实中的需求原型,并对其进行剖析与分解,使其转化为实际的功能点与流程?

五、考察其学习ecstore及ec-os的能力
问题1:请谈谈你对ecstore与ecos系统的理解?

六、大约花15分钟写一小段自己认为比较经典的代码,并阐述代码亮点所在(加分-可选)


问题
1. 选择合适的答案填入空白处
PHP 是一种______脚本语言,基于______引擎。PHP 最常被用来开发动态的______内
容,此外,它同样还可被用来生成______(以及其他)文档。
A.动态,PHP,数据库,HTML
B.嵌入式,Zend,HTML,XML
C.基于 Perl 的,PHP,Web,静态
D.嵌入式,Zend,Docbook 文档,MySQL
E.基于 Zend 的,PHP,图像,HTML
1. 唯一有意义的答案是 B。PHP 是一种基于 Zend 引擎的脚本语言,它通常被嵌入在 HTML
代码中。它主要被用来开发 HTML 文档,但是也可以用它来开发其他类型的文档,比
如 XML。

2.以下哪种标签不是 PHP 起始/结束符?
A.<% %>
B.//
C.
D./* */
E.

2. PHP 编程中,人们不太使用<% %>和两个标签,但它们确实是合法的 PHP 界定符。
标签是非法的,因此正确的答案是 D。记住,根据 php.ini 文件中的配置不同,这
当中的某些标签无法在特定的情况下使用。

3.以下代码哪个不符合 PHP 语法?
A.$_10
B.${“MyVar”}
C.&$something
D.$10_somethings
E.$aVaR
3. PHP 变量以一个美元符号为开头,后面跟上任意数量的数字、字母和下划线。${“MyVar”}
是一个合法的变量名,它使用的是较松散的命名约定。&$something 是对$something 的
引用。然而,变量名不能以数字为开头,$10_somethings 是非法的,因此答案是 D。

4.运行以下代码将显示什么?
define(myvalue, "10");
$myarray[10] = "Dog";
$myarray[] = "Human";
$myarray['myvalue'] = "Cat";
$myarray["Dog"] = "Cat";
print "The value is: ";
print $myarray[myvalue]."\n";
?>
2
A.The Value is: Dog
B.The Value is: Cat
C.The Value is: Human
D.The Value is: 10
E.Dog

4. 注意,$myarray 的键值并没有打上引号。所以,正在访问的键不是 myvalue 字符串,
而是常量 myvalue 的值。最终访问的是$myarray[10],值是 Dog,答案是 A。

5. print()和 echo()有什么区别?
A.print()能作为表达式的一部分,echo()不能
B.echo()能作为表达式的一部分,print()不能
C.echo()能在 CLI(命令行)版本的 PHP 中使用,print()不能
D.print()能在 CLI(命令行)版本的 PHP 中使用,echo()不能
E.没有区别:两个函数都打印文本!

5. 尽管 print()和 echo()在绝大多数情况下可以互换使用,但它们之间还是有一处不同。
print()是函数,有返回值;echo()实际上是一个语言结构,没有返回值,并且不能在表
达式中使用。因此,答案是 A。

6.以下脚本输出什么?
$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;
?>
A.128
B.42
C.242.0
D.256
E.342

6. %运算符表示取模,它返回两个操作数相除的余数。<<是左移运算符,相当于乘以 2
的 N 次方。最后的答案乘以了一个浮点数,改变了它的数据类型。但是,由于小数点
后是零,因此输出的结果不包含小数部分。答案是 256(D)。

7.如何给变量$a,$b 和$c 赋值才能使以下脚本显示字符串“Hello, World!”?
$string = "Hello, World!";
$a = ?;
3
$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.";
}
}
?>
A.False, True, False
B.True, True, False
C.False, True, True
D.False, False, True
E.True, True, True
7. 根据条件式的逻辑,要想得到 Hello, World!字符串,必须要在第一个 if 结构中满足 else
的条件。因此$a 必须为 False,然后$b 也必须为 False。最内层的条件语句的实现要求
先前的两个变量($a 和$b)是 False,而$c 必须是 True(答案是 D)。

8.以下脚本输出什么?
$array = '0123456789ABCDEFG';
$s = '';
for ($i = 1; $i < 50; $i++) {
$s .= $array[rand(0,strlen ($array) - 1)];
}
echo $s;
?>
A.50 个随机字符组成的字符串
B.49 个相同字符组成的字符串,因为没有初始化随机数生成器
C.49 个随机字符组成的字符串
D.什么都没有,因为$array 不是数组
4
E.49 个字母‘G’组成的字符串
8. 正确答案是 C。从 PHP4.2.0 开始,除非已经给定了一个伪随机整数列,否则不再需要
用 srand()函数初始化随机数生成器。此外,即使随机数生成器没有被事先播种,脚本
仍然会生成 49 个伪随机字符。尽管$array 变量是字符串,但可以用访问数组的方式进
行访问——使用数字索引访问某个位置上的字符。最后,for 循环将从 1 开始执行到 50,
也就是执行了 49 次

9.哪种语句结构用来表现以下条件判断最合适?
if($a == 'a') {
somefunction();
} else if ($a == 'b') {
anotherfunction();
} else if ($a == 'c') {
dosomething();
} else {
donothing();
}
?>
A.没有 default 的 switch 语句
B.一个递归函数
C.while 语句
D.无法用别的形式表现该逻辑
E.有 default 的 switch 语句

9. 用一系列的 if…else 语句来检查一个条件的代码块,最适合用 switch 语句来替代。
switch($a) {
case 'a':
somefunction();
break;
case 'b':
10
anotherfunction();
break;
case 'c':
dosomething();
break;
default:
donothing();
}
?>
因为 if 语句中有一个捕捉所有其他条件的 else,对应的,switch 代码块需要一个 default。
正确答案是 E。

10.要修改每个元素的值,如何遍历$myarray 数组最合适?
$myarray = array ("My String","Another String","Hi, Mom!");
?>
A.用 for 循环
B.用 foreach 循环
C.用 while 循环
D.用 do…while 循环
E.办不到!

10.通常情况下,foreach 语句是遍历数组的首选。但是,由于 foreach 语句是在数组的副
本上进行操作,而我们需要给数组中每个元素重新赋值,所以在这里 foreach 就不适用
了。尽管也可以用 while 循环和 do…while 循环,但由于数组是顺序索引的,最合适的
语句还是 for 语句。因此答案是 A。
$myarray = array ("My String", "Another String", "Hi, Mom!");
for($i = 0; $i < count($myarray); $i++)
{
$myarray[$i] .= " ($i)";
}
?>

11.考虑如下代码片段:
define("STOP_AT", 1024);
$result = array();
/* 在此处填入代码 */
{
5
$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

11.由于题目只允许填写一行代码,唯一合适的是 for 循环,因此答案只能是 C 或者 D。
要选出能生成正确结果的 for 循环,我们必须先复习一下 for 循环的构成要素。PHP 中,
for 循环是这样声明的:
for(<初始化>;<继续执行,直到>;<重复执行>)
<初始化>在循环开始时执行一次,然后 for 循环开始执行大括号内的代码,直到<继续
执行,直到>的值为 False。每完成一次循环,执行一次<重复执行>。因此,正确的代
码块应该是:
for ($idx = 1; $idx < STOP_AT; $idx = 2)
答案是 C。
12.为用户定义函数 is_leap()选择一个合适的函数声明。is_leap 使用 2000 作为默认年份。
/
函数声明处 /
{
$is_leap = (!($year %4) && (($year % 100) ||
!($year % 400)));
return $is_leap;
}
var_dump(is_leap(1987)); /
Displays false /
var_dump(is_leap()); /
Displays true */
?>
A.function is_leap($year = 2000)
B.is_leap($year default 2000)
C.function is_leap($year default 2000)
6
D.function is_leap($year)
E.function is_leap(2000 = $year)

12.5 个选项中,只有两个是合法的 PHP 函数声明(A 和 D)。在这两个选项中,只有一
个设置了参数的默认值——答案是 A。

13.运行以下代码将显示什么值?假设代码运行时的 URL 是:testscript.php?c=25
function process($c, $d = 25)
{
global $e;
$retval = $c + $d - $_GET['c'] - $e;
return $retval;
}
$e = 10;
echo process(5);
?>
A.25
B.-5
C.10
D.5
E.0
13.本题考察 PHP 中变量作用域的相关知识。你必须明确 global 关键字是如何将变量引入
本地域的,以及$_GET、$_POST、$_COOKIE、$_REQUEST 等超级全局变量的作用
域。本题中,最终的数学表达式是 5+25-25-10,等于-5,答案是 B。

14.考虑如下代码:
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;
7
$b = false;
/* Group A /
$name = $s[?].$s[?].$s[?].$s[?].$s[?].$s[?];
/
Group B */
$name(${$s[?]}, ${$s[?]});
?>
脚本中的每个问号(?)代表$s 数组的一个数字索引。要想代码执行时显示 Hello, World!字符
串,该如何选择数字索引?
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

14.函数能被以一个包含着函数名的变量后面加上括号(以及必要的参数)的形式动态
调用。对于Group A来说,合适的索引组合是0,4,9,9,9,9,产生字符串myfunction。
另一方面,参数将使用${}结构的可变变量。对Group B来说,合适的索引应该是7
和8,等于${‘a’}$和{‘b’}——即$a和$b。因此答案是D。

15.运行时(run-time)包含一个 PHP 脚本使用______,而编译时(compile-time)包含一
个 PHP 脚本使用______。
A.include_once, include
B.require, include
C.require_once, include
D.include, require
E.以上皆可

15.在较新版本的 PHP 中,require(或 requier_once())和 include()(或 include_once())只有
一个区别——如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执
行;而后者只会产生一个警告。因此答案 E 正确。
16.什么情况下声明函数时不能给参数赋默认值?
A.当参数是布尔值时
B.当函数是类中的成员时
C.当参数是通过引用传递时
D.当函数只有一个参数时
E.永远不会

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

17.______操作符在两个操作数中有一个(不是全部)为 True 时返回 True。
答案:____________

17.正确答案是逻辑异或(xor)运算符。

18.全等运算符===如何比较两个值?
A.把它们转换成相同的数据类型再比较转换后的值
B.只在两者的数据类型和值都相同时才返回 True
8
C.如果两个值是字符串,则进行词汇比较
D.基于 strcmp 函数进行比较
E.把两个值都转换成字符串再比较

18.全等运算符比较两个操作数的数据类型和值,两者中有一个不同,都会返回 False。因
此答案是 B。

19.以下哪个选项是把整型变量$a 的值乘以 4?(双选)
A.$a *= pow (2, 2);
B.$a >>= 2;
C.$a <<= 2;
D.$a += $a + $a;
E.一个都不对

19.答案是 A 和 C。A 选项中,pow 函数计算 2 的平方,答案是 4。C 选项中,左移运算
符将$a 的值左移两位,相当于乘以 4。

20.一段脚本如何才算彻底终止?
A.当调用 exit()时
B.当执行到文件结尾时
C.当 PHP 崩溃时
D.当 Apache 由于系统故障而终止时

20.答案是 A。一段脚本并不会在执行到文件末尾时终止,所以当前文件才能被其他脚本
包含。至于 PHP 和 Apache 崩溃,这两个说法就太恶搞了。

你可能感兴趣的:(杂记6)