面試題總結(61-100)

61. session和cookie的使用步驟分別是什麼?什麼是sesssion和cookie的生命週期?session和cookie的區別是什麼?php

 cookie是保存在客戶端機器的,對於未設置過時時間的cookie,cookie值會保存在機器的內存中,只要關閉瀏覽器則cookie自動消失。若是設置了cookie的過時時間,那麼瀏覽器會把cookie以文本文件的形式保存到硬盤中,當再次打開瀏覽器時cookie值依然有效。html

 

 session是把用戶須要存儲的信息保存在服務器端。每一個用戶的session信息就像是鍵值對同樣存儲在服務器端,其中的鍵就是sessionid,而值就是用戶須要存儲信息。服務器就是經過sessionid來區分存儲的session信息是哪一個用戶的。程序員

 

 二者最大的區別就是session存儲在服務器端,而cookie是在客戶端。session安全性更高,而cookie安全性弱。web

 session在web開發中具備很是重要的分量。它能夠將用戶正確登陸後的信息記錄到服務器的內存中,當用戶以此身份正則表達式

 訪問網站的管理後臺時,無需再次登陸便可獲得身份確認。而沒有正確登陸的用戶則不分配session空間,即使輸入了redis

 管理後臺的訪問地址也不能看到頁面內容。經過session肯定了用戶對頁面的操做權限。算法

  使用session的步驟:數據庫

 1. 啓動session:編程

  使用session_start()函數來啓動。設計模式

 2. 註冊會話:

     直接給$_SESSION數組添加元素便可。

 3. 使用會話:

  判斷session是否爲空或者是否已經註冊,若是已經存在則像普通數組使用便可。

 4. 刪除會話:

  1.可使用unset刪除單個session;

  2.使用$_SESSION=array()的方式,一次註銷全部的會話變量;

  3.使用session_destroy()函數來完全銷燬session。

 cookie怎麼使用?

 1. 記錄用戶訪問的部分信息

 2. 在頁面間傳遞變量

 3. 將所查看的internet頁存儲在cookies臨時文件夾中,能夠提升之後的瀏覽速度。

 建立cookie:

  setcookie(string cookiename , string value , int expire);

 讀取cookie:

  經過超級全局數組$_COOKIE來讀取瀏覽器端的cookie的值。

 刪除cookie:有兩種方法

  1.手工刪除方法:

   右擊瀏覽器屬性,能夠看到刪除cookies,執行操做便可將全部cookie文件刪除。

  2.setcookie()方法:

   跟設置cookie的方法同樣,不過此時將cookie的值設置爲空,有效時間爲0或小於當前時間戳。

 

62. 如何設置一個cookie的名字爲username,值爲jack,而且讓此cookie一週後失效?

 一個瀏覽器最多能夠產生多少個cookie,每一個cookie文件最大不能超過多少?

 setcookie(‘username’,’jack’,time()+7*24*3600);

 最多能夠產生20個cookie,每一個最多不超過4K

 

63. 設置或讀取session以前,須要作什麼?

 能夠直接在php.ini中開啓session.auto_start = 1或者在頁面頭部用session_start();

 開啓session,session_start()前面不能有任何輸出,包括空行。

 

64. 在實際開發中,session在哪些場合使用?

 session用來存儲用戶登陸信息和用在跨頁面傳值。

 1)經常使用在用戶登陸成功後,將用戶登陸信息賦值給session;

 2)用在驗證碼圖片生成,當隨機碼生成後賦值給session。

 

65. 註銷session會話的形式有幾種?

 unset() 

 $_SESSION=array();

 session_destroy();

66. 什麼是OOP?什麼是類和對象?什麼是類屬性?

 OOP(object oriented programming),即面向對象編程,其中兩個最重要的概念就是類和對象。

 世間萬物都具備自身的屬性和方法,經過這些屬性和方法能夠區分出不一樣的物質。

 屬性和方法的集合就造成了類,類是面向對象編程的核心和基礎,

 經過類就將零散的用於實現某個功能的代碼有效地管理起來了。

 

 類只是具有了某些功能和屬性的抽象模型,而實際應用中須要一個一個實體,也就是須要對類進行實例化,

 類在實例化以後就是對象。★類是對象的抽象概念,對象是類的實例化。

 OOP具備三大特色:1. 封裝性(又叫作隱藏性);2. 繼承性; 3. 多態性。

 OOP的優勢:一、代碼重用性高(省代碼) 二、使程序的可維護性高(擴展性) 三、靈活性

 

67. 經常使用的屬性的訪問修飾符有哪些?分別表明什麼含義?(重點)

 private,protected,public。

 

 類外:public 

 子類中:public,protected 

 本類中:private,protected,public 

 類前面:只能加final,abstract

 屬性前面:必須有訪問修飾符(private,protected,public)

 方法前面:static,final,private,protected,public ,abstract

 

68. $this和self、parent這三個關鍵詞分別表明什麼?在哪些場合下使用?

 $this 當前對象

 self  當前類

 parent  當前類的父類

 

 $this在當前類中使用,使用->調用屬性和方法。

 self也在當前類中使用,不過須要使用::調用。

 parent在類中使用。

 

69.類中如何定義常量、如何類中調用常量、如何在類外調用常量。(擴展)

 類中的常量也就是成員常量,常量就是不會改變的量,是一個恆值。

 定義常量使用關鍵字const.

 例如:const PI = 3.1415326;

 不管是類內仍是類外,常量的訪問和變量是不同的,常量不須要實例化對象,

 訪問常量的格式都是類名加做用域操做符號(雙冒號)來調用。

 即:類名 :: 類常量名; 

 

70. 做用域操做符::如何使用?都在哪些場合下使用?(擴展)

 調用類常量

 調用靜態方法

 

71. 什麼是魔術方法?經常使用的魔術方法有哪幾個?(重點)

 以__開頭的系統自定義的方法。

 __construct()

 __destruct()

 __autoload()

 __call()

 __tostring()

 

72. 什麼是構造方法和析構方法?

 構造方法就是在實例化一個對象的同時自動執行的成員方法,做用就是初始化對象。

 php5以前,一個跟類名徹底相同的方法是構造方法,php5以後魔術方法__construct()就是構造方法。

 若是類中沒有定義構造方法,那麼php會自動生成一個,這個自動生成的構造方法沒有任何參數,

 沒有任何操做。

 構造方法的格式以下:

 function __construct(){}

 或者:function 類名(){}

 構造方法能夠沒有參數,也能夠有多個參數。

 析構方法的做用和構造方法正好相反,是對象被銷燬時被自動調用的,做用是釋放內存。

 析構方法的定義方法爲:__destruct();

 由於php具備垃圾回收機制,能自動清除再也不使用的對象,釋放內存,通常狀況下能夠不手動建立析構方法。

 

73. __autoload()方法的工做原理是什麼?(重點)

 使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。

 當程序執行到實例化某個類的時候,若是在實例化前沒有引入這個類文件,那麼就自動執行__autoload()函數。

 這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件後

 就執行include或者require來載入該類,而後程序繼續執行,若是這個路徑下不存在該文件時就提示錯誤。

 使用自動載入的魔術函數能夠沒必要要寫不少個include或者require函數。

 

74. 什麼是抽象類和接口?抽象類和接口有什麼不一樣和類似的地方?

 抽象類是一種不能被實例化的類,只能做爲其餘類的父類來使用。

 抽象類是經過關鍵字 abstract 來聲明的。

 抽象類與普通類類似,都包含成員變量和成員方法,二者的區別在於,抽象類中至少要包含一個抽象方法,

 抽象方法沒有方法體,該方法天生就是要被子類重寫的。

 抽象方法的格式爲:abstract function abstractMethod();

  

 由於php中只支持單繼承,若是想實現多重繼承,就要使用接口。也就是說子類能夠實現多個接口。

 接口類是經過interface關鍵字來聲明的,接口類中的成員變量和方法都是public的,方法能夠不寫關鍵字public,

 接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現的。

 抽象類和接口實現的功能十分類似,最大的不一樣是接口能實現多繼承。在應用中選擇抽象類仍是接口要看具體實現。

 子類繼承抽象類使用extends,子類實現接口使用implements。

 

 抽象類至少有一個抽象方法嗎?

 答:若是一個類聲明成抽象類,裏面能夠沒有抽象方法

     若是一個類中有抽象方法,這個類必須是抽象類

 

75. __call的參數有幾個,類型是什麼,意義是什麼?

 魔術方法__call()的做用是當程序調用一個不存在或不可見的成員方法時,php會先調用__call()方法,

 將那個不存在的方法的方法名和參數都存儲下來。

 __call()包含兩個參數,  第一個參數是那個不存在的方法的方法名,是個字符串類型;

    第二個參數是那個不存在的方法的全部參數,是個數組類型。

 本人認爲__call()方法的意義更多在於調試,能夠定位到錯誤。同時能夠捕捉異常,若是某個方法不存在,

 則執行其它可替代方法。

76. smarty模板技術的用途是什麼?

 爲了php與html分開,美工和程序員各司其職,互不干擾。

 

77. smarty配置主要有哪幾項?

 1. 引入smarty.class.php;

 2. 實例化smarty對象;

 3. 從新修改默認的模板路徑;

 4. 從新修改默認的編譯後文件的路徑;

 5. 從新修改默認的配置文件的路徑;

 6. 從新修改默認的cache的路徑。

 7. 能夠設置是否開啓cache。

 8. 能夠設置左側和右側定界符。

 

78. smarty在使用過程當中須要注意哪些細節?

 Smarty是基於MVC概念的一種模板引擎,它將一個頁面程序分紅了兩部分來實現:即視圖層和控制層,

 也就是說smarty技術將用戶UI與php代碼分離開。

 這樣程序員和美工各司其職,互不干擾。

 

 smarty運用過程當中要注意如下幾個問題:

 1.正確配置smarty。主要要實例化smarty對象,配置smarty模板文件的路徑;

 2.php頁面中使用assign賦值 和 display顯示頁面;

 3.smarty模板文件中不容許出現php代碼段,全部的註釋,變量,函數都要包含在定界符內。

  A.{}

  B. foreach

  C. if else

  D. include

  E. literal

 

79. MVC的概念是什麼?各層主要作什麼工做?

 MVC(即模型-視圖-控制器)是一種軟件設計模式或者說編程思想。

 M指Model模型層,V是View視圖層(顯示層或者用戶界面),C是Controller控制器層。

 使用mvc的目的是實現M和V分離,從而使得一個程序能夠輕鬆使用不一樣的用戶界面。

 在網站開發中,

 模型層通常負責對數據庫表信息進行增刪改查,

 視圖層負責顯示頁面內容,

 控制器層在M和V之間起到調節做用,控制器層決定調用哪一個model類的哪一個方法,

 執行完畢後由控制器層決定將結果assign到哪一個view層。

 

80. oop中的多態性跟方法重寫有什麼關係?

態性是面向對象編程的一種特性,和方法無關。

簡單說,就是一樣的一個方法可以根據輸入數據的不一樣,作出不一樣的處理,即方法的重載——有不一樣的參數列表(靜態多態性)

而當子類繼承自父類的相同方法,輸入數據同樣,但要作出有別於父類的響應時,你就要覆蓋父類的方法,即在子類中重寫該方法——相同參數,不一樣實現(動態多態性)

81. php支持方法的重載嗎?不少參考書中提到的php重載實際上該如何正確理解?

 答: php不支持方法的重載,不少書裏提到的PHP‘重載’應該是‘重寫’

 

82. final關鍵字能定義類中的成員屬性嗎?

 答:不能,類的成員屬性只能有public ,private , protected  來定義

 

83. final關鍵字定義的類可以被繼承嗎?

 答:final定義的類不能被繼承

 

84. 說說static關鍵字的使用場合?static能用在class前嗎?

static能夠跟public,protected,private一塊兒使用嗎?構造方法能夠是static的嗎?

答: static能夠在屬性和方法前面使用,調用static屬性或者方法時,只要將類載入就可用,不用實例化

static不能用在class的前面

static能夠跟public,protected,private一塊兒使用,在方法的前面;

▲構造方法不能是static

 

85. 接口能夠實例化嗎?抽象類能實例化嗎?

 答:接口和抽象類都不能被實例化

 

86. class前面能加訪問修飾符嗎?若是能加,只能是哪幾個訪問修飾符?能夠是權限訪問修飾符public,protected,private嗎?

 答:class前面能夠加final,static; 

 ★class前面不能加public,protected,private

 

87. 類中屬性前能夠不加訪問修飾符嗎?成員變量前的修飾符只能是public,protected,private嗎?還能夠是哪幾個?

 答:類中的屬性必須加修飾符,除了那3個之外,還能夠加var

 

88. 若是echo一個數組,頁面輸出什麼?echo一個對象呢?print一個數組或者對象呢?

 答:頁面只能輸出「Array」;echo一個對象會出現「Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33」

     print一個數組時也只是輸出「Array」,print一個對象出現「Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php 」

     ▲print和echo是同樣的  

 

89. __tostring()魔術方法在何時被自動執行? __tostring()魔術方法必需要return返回值嗎?

 當echo或者print一個對象時,就是自動觸發。並且__tostring()必需要返回一個值 

 

90. 什麼是抽象方法?

 答:在方法前面有abstract,並且方法沒有方法體,連「{ }」也不能有

91. 若是一個類中有一個方法是抽象方法,而這個類沒有定義成抽象類,會報錯嗎? 

 答:會,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"

 

92. 若是一個類是抽象類,而類中的方法都是非抽象的方法,會報錯嗎?

 答:不會報錯,若是一個類是抽象類,其中能夠沒有抽象方法,可是一個類中有個方法是抽象方法,那麼這個類必定是一個抽象類

 

93 PHP有哪些設計模式?

 

單例模式

  1. $_instance必須聲明爲靜態的私有變量

  2. 構造函數和析構函數必須聲明爲私有,防止外部程序new 類從而失去單例模式的意義

  3. getInstance()方法必須設置爲公有的,必須調用此方法 以返回實例的一個引用

  4. ::操做符只能訪問靜態變量和靜態函數

  5. new對象都會消耗內存

  6. 使用場景:最經常使用的地方是數據庫鏈接。

  7. 使用單例模式生成一個對象後, 該對象能夠被其它衆多對象所使用。

  8. 私有的__clone()方法防止克隆對象

單例模式,使某個類的對象僅容許建立一個。構造函數private修飾, 
申明一個static getInstance方法,在該方法裏建立該對象的實例。若是該實例已經存在,則不建立。好比只須要建立一個數據庫鏈接。

工廠模式

工廠模式,工廠方法或者類生成對象,而不是在代碼中直接new。 
使用工廠模式,能夠避免當改變某個類的名字或者方法以後,在調用這個類的全部的代碼中都修改它的名字或者參數

註冊模式

註冊模式,解決全局共享和交換對象。已經建立好的對象,掛在到某個全局可使用的數組上,在須要使用的時候,直接從該數組上獲取便可。將對象註冊到全局的樹上。任何地方直接去訪問。

適配器模式

將各類大相徑庭的函數接口封裝成統一的API。 
PHP中的數據庫操做有MySQL,MySQLi,PDO三種,能夠用適配器模式統一成一致,使不一樣的數據庫操做,統一成同樣的API。相似的場景還有cache適配器,能夠將memcache,redis,file,apc等不一樣的緩存函數,統一成一致。 
首先定義一個接口(有幾個方法,以及相應的參數)。而後,有幾種不一樣的狀況,就寫幾個類實現該接口。將完成類似功能的函數,統一成一致的方法。

策略模式

策略模式,將一組特定的行爲和算法封裝成類,以適應某些特定的上下文環境。 
eg:假若有一個電商網站系統,針對男性女性用戶要各自跳轉到不一樣的商品類目,而且全部的廣告位展現不一樣的廣告。在傳統的代碼中,都是在系統中加入各類if else的判斷,硬編碼的方式。若是有一天增長了一種用戶,就須要改寫代碼。使用策略模式,若是新增長一種用戶類型,只須要增長一種策略就能夠。其餘全部的地方只須要使用不一樣的策略就能夠。 
首先聲明策略的接口文件,約定了策略的包含的行爲。而後,定義各個具體的策略實現類。

觀察者模式

1:觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象所有會收到通知,並自動更新。 
2:場景:一個事件發生後,要執行一連串更新操做。傳統的編程方式,就是在事件的代碼以後直接加入處理的邏輯。當更新的邏輯增多以後,代碼會變得難以維護。這種方式是耦合的,侵入式的,增長新的邏輯須要修改事件的主體代碼。 
3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。 
定義一個事件觸發抽象類。

原型模式

原型模式(對象克隆以免建立對象時的消耗) 
1:與工廠模式相似,都是用來建立對象。 
2:與工廠模式的實現不一樣,原型模式是先建立好一個原型對象,而後經過clone原型對象來建立新的對象。這樣就免去了類建立時重複的初始化操做。 
3:原型模式適用於大對象的建立,建立一個大對象須要很大的開銷,若是每次new就會消耗很大,原型模式僅須要內存拷貝便可。

裝飾器模式

1:裝飾器模式,能夠動態的添加修改類的功能 
2:一個類提供了一項功能,若是要在修改並添加額外的功能,傳統的編程模式,須要寫一個子類繼承它,並重寫實現類的方法 
3:使用裝飾器模式,僅須要在運行時添加一個裝飾器對象便可實現,能夠實現最大額靈活性。

 

94. final 關鍵字的應用應注意的問題? 

 使用final關鍵字定義的類,禁止繼承。

 使用final關鍵字定義的方法,禁止重寫。

 

95. 若是一個類既要繼承一個父類,又要實現多個接口,該如何寫?

 書寫格式例如: class MaleHuman extends Human implements Animal,Life { ... }

 

96. 什麼是單點入口呢?

        所謂單點入口就是整個應用程序只有一個入口,全部的實現都經過這個入口來轉發,

        好比說在上面咱們就使用index.php做爲程序的單點入口,固然這個是能夠由你本身任意控制的。

 單點入口有幾大好處:

     第1、一些系統全局處理的變量,類,方法均可以在這裏進行處理。好比說你要對數據進行初步的過濾,你要模擬session處理,你要定義一些全局變量,甚至你要註冊一些對象或者變量到註冊器裏面

     第2、程序的架構更加清晰明瞭。

 

97. PHP提供了2套正則表達式函數庫,分別是哪兩套?

 (1) PCRE   Perl兼容正則表達式         preg_   爲前綴

 (2) POSIX  便攜式的操做系統接口       ereg_   爲前綴

 

98. 正則表達式的組成?

    由原子(普通字符,如英文字符)、 

    元字符(有特殊功用的字符)

    模式修正字符 

    一個正則表達式中,至少包含一個原子

 

99. 不經常使用魔術方法的觸發時機?

 __isset()  __unset()的觸發時機

 __sleep()、 __wakeup()  在對對象進行串行化的時候調用

 若是序列化對象的時候,不寫__sleep()方法,則全部的成員屬性都會被序列化,而定義了__sleep()方法,則只序列化指定數組中的變量。

 所以,若是有很是大的對象而並不須要徹底儲存下來時此函數也頗有用。

 使用 __sleep 的目的是關閉對象可能具備的任何數據庫鏈接,提交等待中的數據或進行相似的清除任務。此外,若是有很是大的對象而並不須要徹底儲存下來時此函數也頗有用。 

 使用 __wakeup 的目的是重建在序列化中可能丟失的任何數據庫鏈接以及處理其它從新初始化的任務。

 

100. OOP的三大特性是什麼?

 1. 封裝性:

    也稱爲信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯繫,或者說只公開了一些供開發人員使用的方法。

    因而開發人員只須要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合做,也能有效避免程序間相互依賴,

      實現代碼模塊間鬆藕合。

 2. 繼承性:

    就是子類自動繼承其父級類中的屬性和方法,並能夠能夠添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增長了代碼的可重用性。

    php只支持單繼承,也就是說一個子類只能有一個父類。

 3. 多態性:

    子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。

    因而多個子類中雖然都具備同一個方法,可是這些子類實例化的對象調用這些相同的方法後卻能夠得到徹底不一樣的結果,這種技術就是多態性。

    多態性加強了軟件的靈活性。

相關文章
相關標籤/搜索