PHP筆試面試題精選(一)

本次課程主要圍繞 PHP 面試和筆試中常常會出現的一些知識點,可是面試官會在筆試題基礎上深刻擴展,那麼你知道如何更好的回答讓面試官滿意嗎?題目收集自騰訊,迅雷,美圖等公司的筆試面試題,以及本人面試經歷中印象中的知識點,同時也分享一些面試的經驗,相信對你必定有很大的參考價值。php

本期題目重點涉及基礎知識,安全,跨域,及兩個簡單的設計模式,預告下期重點是:計算機網絡,WebSocket,http協議,tcp協議相關html

講座地址:https://segmentfault.com/l/15...前端

1、PHP部分

1.函數內部 static 和 global 關鍵字的做用jquery

static 是靜態變量,在局部函數中存在且只初始化一次,使用事後再次使用會使用上次執行的結果; 做爲計數,程序內部緩存,單例模式中都有用到。面試

global 關鍵字,引用全局變量,wordpress中大量用到,如面向過程開發。ajax

static 靜態方法,是類的成員方法,但不須要實例化類可直接使用redis

$GLOBAL 在函數內使用具備全局做用域的變量,如$GLOBAL['a']json

2.子類重寫父類的 protected 方法有什麼限制?或者說有什麼要遵照的規則?segmentfault

用例子說明,以 Laravel 框架中的控制器做爲說明設計模式

①final修飾的類方法不可被子類重寫

②PHP是否重寫父類方法只會根據方法名是否一致判斷(5.3之後重寫父類方法參數個數必須一致)

③重寫時訪問級別只能夠等於或者寬鬆於父類 不可提高訪問級別

3.PHP文件末尾是否應該加 ?> 結束符號,爲何?

主要防止 include,require 引用文件,把文件末尾可能的回車和空格等字符引用進來,還有一些函數必須在沒有任何輸出以前調用,就會形成不是指望的結果。PHP文件的編碼不包含BOM的UTF8. 這也是PSR-2中的規範:純PHP代碼文件必須省略最後的 ?> 結束標籤。

4.談一談 PHP 開源框架 CI,ThinkPHP,Laravel 的優缺點及選型依據

CI很是輕量級,是一個簡單的MVC框架,性能也很快。

ThinkPHP3.2國內使用比較多,優勢是文檔很是多,各類問題解決方案比較多,缺點是代碼不夠規範,理念落後。

Laravel 是一個現代化的PHP開發框架,代碼優雅,使用 composer 方式擴展功能,社區活躍,缺點是比較重,比較適合作後臺管理或者應用型WEB系統。

5.Memcache 和 Redis 的讀寫性能(qps)如何?二者優缺點?Redis 支持哪些數據類型?Redis 如何持久化?

讀寫性能:

memcache更加快速,在讀取性能上比 Redis 快,缺點是僅支持字符串。

Redis支持豐富的數據結構類型,字符串,散列(哈希),集合,有序集合,還支持訂閱發佈,地理位置等等。

實際運用中能夠redis,memcache結合,memcache可做爲session存儲的方式,session都是KV類型鍵值對。

Redis 提供了多種不一樣級別的持久化方式:

RDB 持久化能夠在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。

AOF 持久化記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集。 AOF 文件中的命令所有以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還能夠在後臺對 AOF 文件進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小。

Redis 還能夠同時使用 AOF 持久化和 RDB 持久化。 在這種狀況下, 當 Redis 重啓時, 它會優先使用 AOF 文件來還原數據集, 由於 AOF 文件保存的數據集一般比 RDB 文件所保存的數據集更完整。

你甚至能夠關閉持久化功能,讓數據只在服務器運行時存在。

參見:http://doc.redisfans.com/topi...

6.使用 PHP 下載網絡圖片,有哪些方法?

1.file_get_contents

2.readfile讀取內容

3.fopen系列函數

4.curl

7.什麼是 CGI?什麼是 FastCGI?php-fpm,FastCGI,Nginx 之間是什麼關係?

CGI,通用網關接口,用於WEB服務器和應用程序間的交互,定義輸入輸出規範,用戶的請求經過WEB服務器轉發給FastCGI進程,FastCGI進程再調用應用程序進行處理,如php解析器,應用程序的處理結果如html返回給FastCGI,FastCGI返回給Nginx 進行輸出。假設這裏WEB服務器是Nginx,應用程序是 PHP,而 php-fpm 是管理 FastCGI 的,這也就是 php-fpm,FastCGI,和 Nginx 之間的關係。

FastCGI 用來提升 cgi 程序性能,啓動一個master,再啓動多個 worker,不須要每次解析 php.ini. 而 php-fpm 實現了 FastCGI 協議,是 FastCGI 的進程管理器,支持平滑重啓,能夠啓動的時候預先生成多個進程。

8.什麼是 CSRF 攻擊 ?XSS 攻擊?如何防範?

CSRF,跨站請求僞造,攻擊方假裝用戶身份發送請求從而竊取信息或者破壞系統。

講述基本原理:用戶訪問A網站登錄並生成了cookie,再訪問B網站,若是A網站存在CSRF漏洞,此時B網站給A網站的請求(此時至關因而用戶訪問),A網站會認爲是用戶發的請求,從而B網站就成功假裝了你的身份,所以叫跨站腳本攻擊。

CSRF防範:

1.合理規範api請求方式,GET,POST

2.對POST請求加token令牌驗證,生成一個隨機碼並存入session,表單中帶上這個隨機碼,提交的時候服務端進行驗證隨機碼是否相同。

XSS,跨站腳本攻擊。

防範:不相信任何輸入,過濾輸入。

9.列舉經常使用的設計模式並說明?單例模式,觀察者模式等等

看示例代碼。

10.寫一段代碼,實現PHP內部的通知機制,如當一個類的屬性發生變化時,另一個類就能夠收到通知。
圖片描述

觀察者模式的應用,使用代碼示例說明。

對象的一種一對多的關係,當依賴的對象狀態發生改變時,全部依賴它的對象都獲得通知並被自動更新。

觀察者模式又稱發佈訂閱模式。

1.抽象主體(Subject)角色:主體角色將全部對觀察者對象的引用保存在一個集合中,每一個主體能夠有任意多個觀察者。 抽象主體提供了增長和刪除觀察者對象的接口。主體也就是被觀察者。

2.抽象觀察者(Observer)角色:爲全部的具體觀察者定義一個接口,在觀察的主體發生改變時更新本身。

3.具體主體(ConcreteSubject)角色:存儲相關狀態到具體觀察者對象,當具體主體的內部狀態改變時,給全部登記過的觀察者發出通知。具體主體角色一般用一個具體子類實現。

4.具體觀察者(ConcretedObserver)角色:存儲一個具體主體對象,存儲相關狀態,實現抽象觀察者角色所要求的更新接口,以使得其自身狀態和主題的狀態保持一致。

2、前端部分

1.$(「#content .abc」) 和 $(「#content」).find(「.abc」) 哪一個效率更高?

後者,後者使用原生的document.getElementByN ame,ID>Tag>Class.

$(「#content」).find(「.abc」) .find()方法會調用瀏覽器的原生方法(getElementById,getElementByName,getElementByTagName等等),因此速度較快。比$(「#content .abc」) 效率快不少。

第一種慢的緣由:在於 jQuery 內部使用各類選擇器鏈條的選擇順序是從右到左,因此這條語句是先選.abc,而後再一個個過濾出父元素#content,這致使它慢不少。

2.ajax 中如何執行跨域訪問?同子域的狀況如何處理?不一樣子域的狀況如何處理?
圖片描述

跨域的存在是由於瀏覽器的同源策略,一個源表示協議,端口,域名都相同,不然就造成了跨域。

①jsonp,非官方協議,簡單實用

經過JavaScript的callback方式調用,jQuery封裝了jsonp方式的請求。

callback({「result」:0,」msg」:」ok」,」data」:{xxx}})

②服務器響應頭

header("Access-Control-Allow-Origin:*");

/星號表示全部的域均可以接受,/

header(「Access-Control-Allow-Methods:GET,POST");

③iframe實現跨域

3.$(document).ready()函數做用域是什麼?

片斷1:

var MyProject = {};
$(document).ready(function() {
    MyProject.intro = "";
    MyProject.intro = "something";
});
console.log(MyProject.intro); // "something"

片斷2:

$(document).ready(function() {
    var1 = 12;      // no var =global
    var var2 = 24;  // local
});

alert(var1)
alert(var2)

4.$(this) 和 this 關鍵字在 jQuery 中有何不一樣?

一個是jquery對象,一個是js的屬性

5.jsonp 和 iframe 跨域訪問原理是什麼?

一個jsonp的例子,js代碼:

//JAVASCRIPT
$.getJSON('http://www.example.com/jsonp.php?callback=?','firstname=Jeff',function(res){
    alert('Your name is '+res.fullname);
});

//SERVER SIDE
  <?php
 $fname = $_GET['firstname'];
      if($fname=='Jeff'){
          //header("Content-Type: application/json");
         echo $_GET['callback'] . '(' . "{'fullname' : 'Jeff Hansen'}" . ')';
      }
?>

Ajax發jsonp請求:

$.ajax({
        url: "http://api.flickr.com/services/rest/?method=flickr.interestingness.getList ",
        dataType: "jsonp",
        jsonp: 'jsoncallback',
        success: function(data) {
            alert(data);
        }
    });

注意:對於上面第二個ajax示例,url中沒必要帶有callback參數,jquery會自動添加。

Jsonp參數是callback名稱,指的就是服務端$_GET[‘callback’]裏的callback的名稱。

實際發的請求就是http://api.flickr.com/service... 1471419449018

dataType: 'jsonp',用於表示這是一個 JSONP 請求。
jsonp: 'callback',用於告知服務器根據這個參數獲取回調函數的名稱,一般約定就叫 callback。
jsonpCallback: 'dosomething',回調函數的名稱,也是前面callback參數的值,可省略,jquery會自動生成。
JSONP 的原理

AJAX 沒法跨域是受到「同源政策」的限制,可是帶有src屬性的標籤(例如<script>、<img>、<iframe>)是不受該政策限制的,所以咱們能夠經過向頁面中動態添加<script>標籤來完成對跨域資源的訪問,這也是 JSONP 方案最核心的原理。

缺點:防止xss注入

Iframe跨域

若是兩個窗口一級域名相同,只是二級域名不一樣,document.domain設置爲同一個主域

相關文章
相關標籤/搜索