欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

一道新浪的 PHP 面试题,代码输出是否跟运行环境相关?

程序员文章站 2022-05-05 09:03:51
...
写出以下代码的输出:

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 语句这个知识点。我学艺不精,回答只答对了一半。那么面试官的追问:代码只有可能有一种输出的观点是否正确呢?