写出以下代码的输出:
try {
include_once "aaa";
print "aaa";
} catch (Exception $e) {
print 'dddd';
}
我的回答是:如果 include_path 中包含有 aaa 为文件名的文件,则代码输出 aaa。 否则输出 ddd。
面试官对我的回答提出质疑:代码就是代码,只有可能有一种输出结果。
我对面试管的追问答复:
你可以认为我这道题答错了。
从这道题以后面试官(一面)对我的技术能力持怀疑态度。后面的 MySQL char(2) 能保存几个中文字符,由于学艺不精没有答上来。后来二面直接让我在待遇和机遇中做权衡。
回复内容:
首先面试不一定要回答出abc才是正确的...
最主要的是一次思考的过程,对于很多知识点举一反三的能力...
第一题:考的是include 和 require的区别
include 包含不存在的文件,只会抛出warning,require 包含不存在的文件会报fatal error
所以该题无论如何都会输出ddd 因为不会报错,所以不会抛出异常...
反之如果是require包含,如果aaa文件不存在则会抛出异常,跳转到catach代码块,否则输出ddd
第二题:考的是对中文按字节如何存储,char 存储的字节
utf-8下 每个中文对应3个字节,char(2) 代表该行该列存储暂用2个字节(无论存几个字符)
所以1个都办法存储...
如果你能这样回答,并举一反三的话,面试官一定会看好你哦~
latin1:
1character=1byte, 1汉字=2character(字符),
也就是说一个字段定义成 varchar(200),则它可以存储100个汉字或者200个字母。
这一点要注意,尤其是当字段内容是字母和汉字组成时,尽量假设字段内容都是由汉字组成,据此来设置字段长度
utf8:
1character=3bytes, 1汉字=1character(字符)
也就是说一个字段定义成 varchar(200),则它可以存储200个汉字或者200个字母。
gbk:
1character=2bytes,1汉字=1character(字符)
也就是说一个字段定义成 varchar(200),则它可以存储200个汉字或者200个字母。
第一题经过测试 Warning之后输出 aaa 如果换成require 也只是到Fatal error: require() [function.require]: Failed opening required 'aaa' 。。。然后什么都不会再输出了,也不抛出异常
第二题 经过测试可以存储2个中文字符
CREATE TABLE `testchar` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aa` char(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `testchar` VALUES ('1', '啊');
INSERT INTO `testchar` VALUES ('2', '啊啊');
INSERT INTO `testchar` VALUES ('3', '啊啊啊');
刚才在本机做了一下测试,当 include_path 中没有找到 aaa 为文件名的文件时,该代码会有 Warning 级别的错误提示:failed to open stream ....。而当include_path 中存在该文件时,代码会输出"aaa".
我认为这道题实际是考察 include_once 的报错会无视 try catch 语句这个知识点。我学艺不精,回答只答对了一半。那么面试官的追问:代码只有可能有一种输出的观点是否正确呢?