一道新浪的 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 瀏覽器合作的嗎?