php常見面試題總結


以下全部是轉載別人的總結,感覺回答不錯:

  面試之前多看看公司的資料,可以看出面試的公司主要做什么,電商,數據庫,PHP函數,SQL的優化,接口,session和cookie等經常會問到,都是必問之題,這其中有一部分題目整理自網絡,個人感覺回答的也不錯。

 

   

1.請自我介紹一下?

        答:根據自己情況回答

2.你是公司負責那些項目?

        答:由於我們公司是一個外包公司,很多項目都是交叉進行的,論壇,微信,商城我都做過,我主要負責的模塊有.....;

3.你為什么來深圳?

        答:根據自己情況回答,最好真實一些.

4.現在在武漢什么框架比較流行?

        答:根據自己的區域回答;

5.你做過那些模塊?

        答:登陸注冊,商品管理,購物車模塊,訂單管理等;

6.你們公司是使用什么框架?

        答:我們公司采用的是TP框架,運用的MySQL+APACHE+ PHP進行開發,因 為TP框架是一個免費開源的,輕量級的,PHP的開發框架,而且是我們中國人自己開發的,也是國內用的比較多的,並且各種資料也比較齊全;

7.什么是mvc?相互間有什么關系?

        答:MVC是一種開發模式,主要分為三部分:M(模型),也就是模型,負責數據的操作; V(視圖),也就是視圖,負責前后台的顯示; C(控制器),也就是控制器,負責業務邏輯;

                客戶端請求項目的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據通過視圖顯示出來;

8.OOP是什么?

        答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。

OOP具有三大特點:

1、封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。於是開發人員只 需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。 

2、繼承性:就是子類自動繼承其父級類中的屬性和方法,並可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。 

3、多態性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。於是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。 

1、易維護 

采用面向對象思想設計的結構,可讀性高,由於繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。 

2、質量高 

在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求並具有較高的質量。 

3、效率高 

在軟件開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近於日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。 

4、易擴展 

由於繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。

9 .smarty是什么,有什么作用?

       回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一,它分離了邏輯代碼和外在的顯示,提供了一種易於管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離

        回答二:smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過

         回答三: smarty是個模板引擎,最顯著的地方就是有可以把模板緩存起來。一般模板來說,都是做一個靜態頁面,然后在里面把一些動態的部分用一切分隔符切開,然后在PHP里打開這個模板文件,把分隔符里面的值替換掉,然后輸出來,你可以看下PHPLib里面的template部分。

    而smarty設定了緩存參數以后,第一次運行時候會把模板打開,在php替換里面值的時候把讀取的html和php部分重新生成一個臨時的php文件,這樣就省去了每次打開都重新讀取html了。如果修改了模板,只要重新刷下就行了。

10.TP框架有哪些優點?

        答:ThinkPHP 框架是 PHP 最常見的框架之一,也是目前市面上的主流框架。ThinkPHP 是一個免費開源的,快速、簡單的面向對象的輕量級 PHP 開發框架 ,是為了敏捷 WEB 應用開發和簡化企業應用開發而誕生的。ThinkPHP 從誕生以來一直秉承簡潔 實用的設計原則,在保持出色的性能和至簡的代碼的同時,也注重易用性。並且擁有眾多的原創功能和特性,在易用性、擴展性和性能方面不斷優化和改進,已經成長為國內最領先和最具影響力的 WEB 應用開發框架,眾多的典型案例確保可以穩定用於商業以及門戶級的開發。

11.TP的特性有哪些?

        答: 1.多表查詢非常方便,在model中幾句代碼就可以完成對多表的關聯操作

               2.融合了smarty模板,使前后台分離

               3.支持多種緩存技術,尤其對memcache技術支持非常好

               4.命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應

               5.支持多種url模式

               6.內置ajax返回方法,包括xml,json,html等

               7.支持應用擴展,類庫擴展,驅動擴展等

12.TP框架中的大字母函數?

U:對url的組裝

A:內部實例化控制器

S:緩存處理

R:調用某個控制器的操作方法

D:實例化自定義模型類

M:實例化基礎模型類

I:獲取參數

L:設置或者獲取當前語言

C:設置或獲取,保存配置

13.請介紹一下laravel框架?

        答: laravel框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你准備好了一切,composer是php的未來,沒有composer,php肯定要走向沒落

    laravel框架最大的特點和優秀之處就是集合了php比較新的特點,以及各種各樣的設計模式,Ioc模式,依賴注入等

14.laravel有那些特點?

        回答一: 

          1.強大的rest router:用簡單的回調函數就可以調用,快速綁定controller和router

          2.artisan:命令行工具,很多手動的工作都自動化

          3.可繼承的模板,簡化view的開發和管理

          4.blade模板:渲染速度更快

          5.ORM操作數據庫

          6.migration:管理數據庫和版本控制

          7.測試功能也很強大

          8.composer也是亮點

       回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各種各樣的設計模式等

15.簡述一下數據庫的優化?

        答:數據庫的優化可以從四個方面來優化:

            1.從結構層: web服務器采用負載均衡服務器,mysql服務器采用主從復制,讀寫分離

            2.從儲存層: 采用合適的存儲引擎,采用三范式

            3.從設計層: 采用分區分表,索引,表的字段采用合適的字段屬性,適當的采用逆范式,開啟mysql緩存

            4.sql語句層:結果一樣的情況下,采用效率高,速度快節省資源的sql語句執行

16.如何解決異常處理?

        答: 拋出異常:使用try...catch,異常的代碼放在try代碼塊內,如果沒有觸發異常,則代碼繼續執行,如果異常被觸發,就會 拋出一個異常。Catch代碼塊捕獲異常,並創建一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。

            解決異常:使用set_error_handler函數獲取異常(也可以使用try()和catch()函數),然后使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面所有的php語句都執行完成時,再調用此函數

17.說說前端?

        答:我在工作中處理前端的功能,一般就是用ajax向后台請求數據,然后返回數據在前台頁面中顯示出來。我從來沒有獨立的完整的將html和css樣式都一個人完成,如果公司實在有這樣的需求的話,我可能會找一些前台的模板或者說是前端的框架,比如說h—ui等等

18.權限管理(RBAC)的實現?

       答: 1.首先創建一張用戶表:id name auto(保存格式為:控制器-方法)

            2.然后在后台中創建一個基類控制器,控制器里封裝一個構造方法,當用戶登陸成功后,使用TP框架中封裝好的session函數獲取保存在服務器中的session id,然后實例化模型,通過用戶id獲取保存在數據表中的auth數據,使用explode函數分割獲取到的數據,並使用一個數組保存起來,然后使用TP框架中封裝好的常量獲取當前控制器和方法,然后把他們組裝成字符串,使用in_array函數進行判斷該數組中是否含有當前獲取到的控制器和方法,如果沒有,就提示該用戶沒有權限,如果有就進行下一步操作.

19.支付功能的實現?

        答:

20.怎么保證促銷商品不會超賣?

        答:這個問題是我們當時開發時遇到的一個難點,超賣的原因主要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:

    第一種方案:①在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大於0的商品的庫存,當時我們使用ab進行壓力測試,當並發超過500,訪問量超過2000時,還是會出現超賣現象。所以被我們否定了。

    第二種方案:②使用mysql的事務加排他鎖來解決,首先我們選擇數據庫的存儲引擎為innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高並發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否定了。

    第三種方案:③使用文件鎖實現。當用戶搶到一件促銷商品后先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大。

最后我們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們采取這種方式來實現

21.商城秒殺的實現?

        答:搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:

            1.高並發對數據庫產生的壓力

            2 競爭狀態下如何解決庫存的正確減少(”超賣”問題)

        對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用Redis。第二個問題,我們可以使用redis隊列來完成,把要秒殺的商品放入到隊列中,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執行,文件鎖和事務在高並發下性能下降很快,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過ajax調用接口,其中也可能會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高並發情況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數據庫,將用戶入結果隊列。

22.購物車的實現原理?

        答:購物車相當於現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。用戶可以在購物網站的不同頁面之間跳轉,以選購自己喜愛的商品,點擊購買時,該商品就自動保存到你的購物車中,重復選購后,最后將選中的所有商品放在購物車中統一到付款台結賬,這也是盡量讓客戶體驗到現實生活中購物的感覺。服務器通過追蹤每個用戶的行動,以保證在結賬時每件商品都物有其主。

主要涉及以下幾點:

    1、把商品添加到購物車,即訂購

    2、刪除購物車中已定購的商品

    3、修改購物車中某一本圖書的訂購數量

    4、清空購物車

    5、顯示購物車中商品清單及數量、價格

實現購物車的關鍵在於服務器識別每一個用戶並維持與他們的聯系。但是HTTP協議是一種“無狀態(Stateless)”的協議,因而服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車里原先有些什么,使得用戶在不同頁面間跳轉時購物車無法“隨身攜帶”,這都給購物車的實現造成了一定的困難。

目前購物車的實現主要是通過cookie、session或結合數據庫的方式。下面分析一下它們的機制及作用。

23.redis隊列消息先進先出需要注意什么?

        答:通常使用一個list來實現隊列操作,這樣有一個小限制,所以的任務統一都是先進先出,如果想優先處理某個任務就不太好處理了,這就需要讓隊列有優先級的概念,我們就可以優先處理高級別的任務,實現方式有以下幾種方式:

1)單一列表實現:隊列正常的操作是 左進右出(lpush,rpop)為了先處理高優先級任務,在遇到高級別任務時,可以直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側)獲取任務時,取到的就是高優先級的任務(rpop)

2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務的級別放入不同的隊列,獲取任務時也很簡單,redis的BRPOP命令可以按順序從多個隊列中取值,BRPOP會按照給出的 key 順序查看,並在找到的第一個非空 list 的尾部彈出一個元素,redis> BRPOP list1 list2 0

list1 做為高優先級任務隊列

list2 做為普通任務隊列

這樣就實現了先處理高優先級任務,當沒有高優先級任務時,就去獲取普通任務

方式1最簡單,但實際應用比較局限,方式3可以實現復雜優先級,但實現比較復雜,不利於維護

方式2是推薦用法,實際應用最為合適

24.你遇到過哪些難題,如何解決的?

        答:在我負責的B2B電商項目中,當時我負責的是訂單模塊,由於客戶一次選擇了多家商戶的商品,最終生成了一個訂單,這樣我們平台在給商戶結算時出現了不知道這比費用應該給哪個商戶,這時候我們小組經過討論,需要涉及到訂單拆分,也就是說用戶點擊支付后,如果有多件商品,並且不是同一家店鋪那么 就要用到訂單的拆分,比如如果有兩件商品,並且不是同一店鋪 就在原來的訂單號下 在生成兩個子訂單號 並修改訂單表中兩件商品的訂單號。最終實現了商品的分配管理,解決了我們的難題。

我覺得在開發過程中,遇到的難題無非是兩個,一個是技術層次的,我認為,只要你有恆心,有熱心,沒有覺得不了的難題。另一個就是溝通問題,在任何地方任何時候溝通都是最重要的,尤其是我們做開發的,不溝通好,會影響整個項目的進度,我本人是個非常還溝通的人,所以這點上也沒多大問題。

25。用戶下單是怎么處理的?

        答:判斷用戶有沒有登錄,在沒有登錄的情況下,不允許下單。登陸后,可進行下單,並生成唯一的訂單號,此時訂單的狀態為未支付。

26.電商的登錄是怎么實現的?

        答:分為普通登錄和第三方登錄 這邊主要說一下第三方登錄吧,第三方登陸主要使用的是author協議,我就以QQ的第三方登陸為例來進行說明:當用戶在我們的站點請求QQ的第三方登陸時,我們站點會引導用戶跳轉到QQ的登陸授權界面, 當用戶輸入QQ和密碼成功登錄以后會自動跳回到我們站點設置好的回調頁面,並附帶一個code參數,接着你使用code再次去請求QQ的授權頁面,就可以從中獲取到一個access token(訪問令牌),通過這個access_token,我們可以調用QQ提供給我們的接口,比如獲取open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權信息和open_id和我們平台的普通用戶進行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實現登陸。

27.接口安全方面是怎么處理的?

        答:我們當時是這么做的,使用HTTP的POST方式,對固定參數+附加參數進行數字簽名,使用的是md5加密,比如:我想通過標題獲取一個信息,在客戶端使用 信息標題+日期+雙方約定好的一個key通過md5加密生成一個簽名(sign),然后作為參數傳遞到服務器端,服務器端使用同樣的方法進行校驗,如何接受過來的sign和我們通過算法算的值相同,證明是一個正常的接口請求,我們才會返回相應的接口數據。

28.用的什么技術實現短信發送,哪在調用?

        答:我主要用的第三方短信接口,在申請接口時進行相應信息的配置,然后在我們站點需要用到短信驗證的地方進行調用,我們通常在用戶注冊時使用到。

29.在工作中遇到什么困難?

       答:總體來說:在工作我主要遇到這幾個問題比較難處理:

①我之前工作的時候發現經常會出現一些臨時需求打亂了我的計划,搞得有時候這個任務還沒完成,又得去做其他的任務,最后一天下來,大大小小的東西是很多,但是沒有完成得非常好的,后面我總結了一下,我會把這些都添加優先級,遇到臨時需求,按照優先級重新將已有任務和臨時任務進行排版,保證在規定時間內有效率的完成優先級高的任務。

②在做項目需求時候,遇到理解能力欠佳的人,溝通時容易被氣到,影響自己的情緒,最后反倒還不能到達需要的效果。后面,每次到這種時候,我一般會借助一些紙質的、更加形象的東西,讓雙方都認同的、都能明白的一種方式來進行溝通,后面減少了很多不必須的麻煩。大家都知道,對於程序員來說,改需求是一件很痛苦的事情,所以前期的溝通工作很重要。

③還有一件事時,我以前的領導不太懂技術,所以每次出一個新的需求出來,總是要求我們在很短的時間內完成,完不成我們就會被懷疑能力有問題。當然,每個領導都希望自己的員工能夠盡快的完成任務,降低成本,提高效率。這時候我會把我們的需求細化,把其中的重點、難點都列出來,做好時間規划,耐心的跟領導溝通,項目每個點的重要性和時間的花費比例,確保在這個規划的時間點內保質保量的完成任務。慢慢的也得到了領導的認可,其實領導也不是一味的不通情理,只要把東西計划好了,以最小的代價換取最高的價值,每個人都是很容易理解得

30.用戶不登錄,把商品加入購物車是怎么實現的?

        答:用戶在不登錄的情況下,可以把要購買商品的信息(如商品的ID,商品的價格、商品的sku_id,購買數量等關鍵數據)存到COOKIE里面,當登陸的情況下。把COOKIE里面的內容存到數據庫,並清除cookie中的數據。

31.寫過接口嗎,怎么定義接口的?

        答:寫過。接口分為兩種:一種是數據型接口,一種是應用型接口。

數據型接口:是比抽象類更抽象的某種“結構”——它其實不是類,但是跟類一樣的某種語法結構,是一種結構規范,規范我們類要以什么格式進行定義,一般用於團隊比較大,分支比較多的情況下使用。

應用型接口: API(application interface) 數據對外訪問的一個入口

我主要是參與的APP開發中接口的編寫,客戶端需要什么樣的數據,我們就給他們提供相應的數據,數據以json/xml的格式返回,並且配以相應的接口文檔。

32.sku減庫存的實現?

        答:SKU = Stock Keeping Unit (庫存量單位) 

即庫存進出計量的單位,可以是以件,盒,托盤等為單位。SKU是庫存量單位,區分單品。 

在服裝、鞋類商品中使用最多最普遍。 例如紡織品中一個SKU通常表示:規格、顏色、款式。

在設計表時,不僅僅只有商品表,商品表中有個總庫存,我們還需要涉及一張SKU表,里面有SKU庫存和單價字段,用戶每購買一件商品,實際上購買的都是SKU商品,這樣在下訂單成功后,應該根據所購買的商品的唯一的SKU號來進行相應的SKU庫存的減少,當然商品的總庫存保存在商品主表中,也需要減少總庫存中的庫存量。

33.庫存怎么設置?

        答:庫存分為商品總庫存和SKU庫存,往往商品總庫存的為SKU庫存的總和。一般在商城的后台對貨品設置最高庫存及最低庫存后,當前庫存數量與最高、最低兩者比較,超出庫存或者低於庫存的,則被統計成報表形式反映,便於用戶掌握貨品庫存超、短缺狀態及數量。

34.訂單,庫存兩個表如何保證數據的一致性? 

         答:在一個電子商務系統中,正常的應該是訂單生成成功后,相應的庫存進行減少必須要保證兩者的一致性,但有時候因為某些原因,比如程序邏輯問題,並發等問題,導致下單成功而庫存沒有減少的情況。這種情況我們是不允許發生的,MySQL的中的事務剛好可以解決這一問題,首先得選擇數據庫的存儲引擎為InnoDB的,事務規定了只有下訂單完成了,並且相應的庫存減少了才允許提交事務,否則就事務回滾,確保數據一致性。

35.O2O用戶下單,c端下單,如何保證ba端數據一致?

       答:O2O為線上和線下模式,O2O模式奉行的是“線上支付+實體店消費”的消費模式,即消費者在網上下單完成支付后,憑消費憑證到實體店消費。 O2O模式是把商家信息和支付程序放在線上進行,而把商品和服務兌現放在線下,也就是說O2O模式適用於快遞無法送達的有形產品。數據一致性的問題是O2O行業中最常見的問題,我們可以類似於數據庫的主從復制的思路來解決這個問題.O2O有個供應商系統,類似於主服務器,在ç端(從服務器)下單時,數據同步更新到供應商系統端,b,a實時從供應商系統中拉取數據進行同步,比如利用定時任務,定時拉取數據進行同步。

36 . echo '1'.print(2)+3

如上所示。結果為什么會是511呢?

這個結果的計算分為三步來理解:

首先計算的是 右邊print(2)+3,這個你可以直接理解成print(2+3),得到的結果是5。而print是一個函數, 它的返回值總是1。

第二步就是echo '1'.print('結果')(返回值是1),因此會得到11的結果。

第三步就是將之前計算的結果進行連接,並最終進行輸出,得到的結果就是511了。

類似的,可以解釋為什么echo '2' . print(2) + 3;的結果是521,

echo '1' . (print '2') + 3;結果是214


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM