一道新浪的 PHP 面試題,代碼輸出是否跟運行環境相關?

寫出以下代碼的輸出:

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 語句這個知識點。我學藝不精,回答只答對了一半。那麼面試官的追問:代碼只有可能有一種輸出的觀點是否正確呢?


推薦閱讀:

新浪推出微領地,街旁緊張嗎?
如何評價新浪微博推出的V6版本?
新浪微博的新版會有更多人喜歡嗎?會不會有很多人更喜歡老版?為什麼?
中國移動發布的衝浪瀏覽器是和 UC 瀏覽器合作的嗎?

TAG:新浪 | PHP | 面試問題 |