BAT招聘PHP程式設計師,曾經問過的10個PHP面試問題
阿新 • • 發佈:2019-02-09
PHP程式設計師的面試,尤其是初面,最看重的就是基礎,基礎,還是基礎。下面列舉出10個問題,涉及的面比較廣,但都是一個程式設計師應當也應該知道的東東。
【1】PHP的整型溢位問題是怎樣的?
PHP的整型數的字長和平臺有關,對於32位的作業系統,最大的整型是有二十多億,其實就是2的31次方,最小為-2的31次方,PHP不支援無符號的整數。 如果一個數超出了integer範圍,將會被自動解釋為float。如果執行的運算結果超出了
integer 範圍,也會返回 float。(那在java、C中的整型整型溢位會怎樣)
【2】如何理解OOP?
OOP,面向物件程式設計,包括三個方面,繼承性、封裝性、多型性,其中最根本的東西就是抽象。
繼承性,即擴充套件性,通過子類對已經存在的父類進行功能擴充套件。
封裝性,要求外部不能隨意存取物件的內部資料,即對該類中的具體實現做封裝,使用者不必知道內部的具體實現,只有知道它是幹什麼的,怎麼用就好了。
多型性,就是類的抽象和介面,同一個類能夠處理多種型別物件的能力。
我們在現實中,看到的任何東東都可以看做為一個物件,然後通過進一步的抽象為類,類又可以演變為很多類似的物件。舉個簡單的例子,將我們看到的一個房子抽象為一個ROOM類,包括基本的門,窗,桌子等物件,人可以進出等功能。 現在我們繼承ROOM類為Classroom,包括扇門,有大窗,有桌椅,另外只包括一個黑白和一個講臺,老師和同學可以上課。現在我們例項化這個Classroom類為Classroom_621物件,包括兩扇門,四扇大窗,30套桌椅,有同學正在上毛概課。
【3】你對於設計模式和MVC的理解
Model-View-Controller,模型、檢視、控制器,一想到MVC就會想到JAVA,因為JAVA是一個完全面向物件的語言,MVC最早出現在smalltalk中,其核心就是要將試圖和資料模型分離,這樣不同的程式就可以有不同的展示。
模型,即程式設計師寫的功能、演算法和資料模型,也就是我們說的系統業務邏輯層。
檢視,即前端,圖形介面。展示給使用者看的。
控制器,主要負責對請求處理、轉發和載入檢視。
設計模式,說白了就是程式碼的設計經驗的總結和歸類,設計模式最早應用於建築行業,程式設計的設計模式按最早的GoF所述,包括23種設計模式,主要用於面向物件的程式程式設計。遵循幾個設計原則:開閉原則、單一職責原則、里氏替換原則、依賴注入、介面分離、迪米特原則、優先使用組合而不是繼承等等。包括建立型模式、結構性模式、行為模式三類。
【4】HTTP協議1.0及1.1的區別,並簡單說下HTTP協議
HTTP,超文字傳輸協議。它定義了瀏覽器和伺服器的通訊規則。HTTP協議是基於TCP/IP的TCP協議上,現在全球資訊網使用的是HTTP1.1版本,其特點包括,C/S模式,請求簡單(GET/POST/HEAD),靈活(可以傳輸任何型別的資料HTML、XML、JSON、自定義等),無連線(每次連線只處理一個請求,從發出請求到收到200狀態為止斷開連線),無狀態。
對HTTP協議的考察主要包括,響應訊息格式、請求訊息格式、狀態碼等知識點。
一般一個HTTP協議包括:起始行(start line)、首部(header)、主體(body)三個部分。
[響應訊息格式]
HTTP/1.1 200 0K
Connectlon:close
Date: Thu, 13 Oct 2005 03:17:33 GMT
Server: Apache/2.0.54 (Unix)
Last—Nodified:Mon,22 Jun 1998 09;23;24 GMT
Content—Length:682l
Content—Type:text/html
這個響應訊息分為3部分:1個起始的狀態行(status line),首部、1個包含所請求物件本身的附屬體。狀態行有3個欄位:協議版本欄位、狀態碼欄位、原因短語欄位。
[請求訊息格式]
GET /somedir/page.html HTTP/1.1
Connection:close
User-agent:Mozilla/4.0
Accept-language:zh-cn
(額外的回車符和換行符)
該請求訊息的第一行稱為請求行 (request line),後續各行都稱為頭部行(header)。請求行有3個欄位:方法欄位、URL欄位、HTTP版本欄位。
[狀態碼]
1xx 訊息
2xx 成功
3xx 重定向
4xx 請求錯誤
5xx 伺服器錯誤
[常見狀態碼]
200 OK。請求已成功,請求所希望的響應頭或資料體將隨此響應返回。
300 Multiple Choices。請求資源有多個選擇,如請求文字有法語版、英語版等等。
301 Moved Permanently。表示請求的網頁已永久轉移到新位置
302 Found。表示頁面在做臨時跳轉時返回的狀態。
304 Not Modified。客戶的快取資源是最新的, 要客戶端使用快取。
400 Bad Request。錯誤的請求。
403 Forbidden。請求被伺服器拒絕了。
404 Not Found。表示伺服器找不到請求的網頁,伺服器上不存在的網頁經常會返回的HTTP狀態碼。
500 Internal Server Error。
503 Service Unavailable。伺服器目前無法為請求提供服務,但過一段時間就可以恢復服務。
504 Gateway Timeout。與狀態嗎408類似, 但是響應來自閘道器或代理,此閘道器或代理在等待另一臺伺服器的響應時出現了超時。
505 HTTP Version not supported。 HTTP協議版本不支援。
【5】簡單說下Apache中rewrite機制和PHP框架中URI路由機制
1)URL重寫,其實就是把使用者通過瀏覽器請求的URL,到了後臺,apache根據預先配置的重寫規則將該請求指向真正的資源路徑,說白了就是打馬虎眼,把真正的路徑改頭換面後給使用者訪問,可問題是這樣做有啥用處呢。
1、SEO方面。將動態的URL靜態化,以滿足搜尋引擎的胃口。
2、訪問控制。比如,通過重寫規則後,客戶端不易判斷後臺程式型別等。
3、URL重定向。當網站更改域名或增加別名URL後,可以通過規則輕鬆的指向要訪問的URL。
mod_rewrite 使用基於正則表示式動態的修改傳入請求的URL。它可以將URL對映到檔案系統路徑,也可以將一個URL對映到另一個URL。它使用了沒有限制數量的規則來操縱URL,每條規則可以包括沒有限制數量的附加條件。你可以通過多種方式來檢測,如,伺服器變數、環境變數、HTTP頭、時間戳等。
mod_rewrite 操作整個URL路徑,包括path-info的部分。一個重寫規則可以被設定在http.conf或者.htaccess中。一個重寫規則生成的路徑可以包括一個請求字串,或者內部的子程式處理,外部請求的重定向,或者穿透內部代理等。
2)PHP框架中的URI路由機制,與apache重寫類似,一般包括萬用字元和正則兩種規則。讓使用者可以重新定向(remap)URI處理程式. 設定你自己的路由規則。
【6】MySQL的索引機制,複合索引的使用原則
一般都會用書本中的目錄來介紹索引機制,包括有些書本會有專門的快速檢索附錄,就很類似於資料庫的索引。
MySQL的索引包括4類:主鍵索引(primary key)、唯一索引(unique)、常規索引(index)、全文索引(fullindex)。
Show index from table_name; –查看錶中的索引
Show status like ‘Handler_read%’ –檢視索引的使用情況
複合索引,一般遵循最左字首原則,如table_a 的 a b c 三列建複合索引
create index ind_table_a on table_a(a,b,c);
那麼,只有在條件中用到a,或者a、b,或者a、b、c這樣的情況下,才會用到剛建的複合索引。
【7】MySQL的表型別及MyISAM與InnoDB的區別
MySQL常見的表型別(即儲存引擎)
show engines檢視支援表型別配置。常見包括:MyISAM/Innodb/Memory/Merge/NDB
其中,MyISAM和Innodb是最常用的兩個表型別,各有優勢,我們可以根據需求情況選擇適合自己的表型別。
[MyISAM]
1)每個資料庫儲存包括3個檔案:.frm(表定義)、MYD(資料檔案)、MYI(索引檔案)
2)資料檔案或索引檔案可以指向多個磁碟
3)Linux的預設引擎,win預設InnoDB
4)面向非事務型別,避免事務型額外的開銷
5)適用於select、insert密集的表
6)MyISAM預設鎖的排程機制是寫優先,可以通過LOW_PRIORITY_UPDATES設定
7)MyISAM型別的資料檔案可以在不同作業系統中COPY,這點很重要,佈署的時候方便點。
[Innodb]
1)用於事務應用程式
2)適用於update、delete密集的操作。執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
3)引入行級鎖和外來鍵的約束
4)InnoDB不支援FULLTEXT型別的索引
【8】簡單說下快速排序演算法
基本思想:通過一趟排序將待排序列分割成兩部分,其中一部分比另一部分記錄小,再分別對這兩部分繼續快速排序,以達到有序。
演算法實現:設有兩個指標low和high,初值為low=1,high=n,設基準值為key(通常選第一個),則首先從high位置開始向前搜尋,找到第一個比key小的記錄與key交換,然後從low位置向後搜尋,找到第一個比key大的記錄與基準值交換,重複直至low=high為止。
第一趟排序結果,key之前的記錄值比key之後的記錄值小。
11 25 9 3 16 2 //選擇11為key
2 25 9 3 16 11
2 11 9 3 16 25
2 3 9 11 16 25
【9】awk、sed、sort的基本使用(用例項考察的)
[例]:有如下檔案test,請統計每個網址出現次數,用一句shell實現。
【答案】cat test| awk -F’ ‘ ‘{print $2}’ |sort | uniq -c | sort -rn
【10】Memcached、redis的使用和理解
Memcached和redis 都是一個key-value的記憶體式儲存系統,通過hash表來儲存檢索結果,做到強大的快取機制。像新浪的微博、淘寶等大流量站點都必須的使用了這些東東。
Memcache是一個高效能的分散式的記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)和zset(有序集合)。