面試題總結101-)

101.常見框架有哪些php

laravel , thinkPHP,yii,ci,目前市場上用得最多的大概就這幾個框架吧。你學好一個框架就有飯吃的咯。html

 

102. 經常使用魔術方法的觸發時機?mysql

 1)__autoload() :當程序實例化某個類,而該類沒有在當前文件中被引入。此時會觸發執行__autoload()。程序但願經過該方法,自動引入這個類文件。該方法有一個參數,即就是那個忘記引入的類的名稱。__autoload()方法的工做原理是什麼?當程序執行到實例化某個類的時候,若是在實例化前沒有引入這個類文件,那麼就自動執行__autoload()函數。這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件後,就執行include或者require來載入該類,而後程序繼續執行,若是這個路徑下不存在該文件時就提示錯誤。使用自動載入的魔術函數能夠沒必要要寫不少個include或者require函數。jquery

 

 2)__construct()  :這個是魔術構造方法。構造方法是實例化對象的時候自動執行的方法,做用就是初始化對象。該方法能夠沒有參數,也能夠有多個參數。若是有參數,那麼new這個對象的時候要記得寫上相應的參數。在php5之前,沒有魔術構造方法,普通構造方法是一個跟類名同名的方法來實現構造的。若是一個類中既寫了魔術構造方法,又定義了普通構造方法。那麼php5以上版本中,魔術方法起做用,普通構造方法不起做用。反之,在php5之前版本中,不認識魔術構造方法,只是把該方法當作普通的方法。laravel

 

 3)__destruct()  :這個是魔術析構方法。析構方法的做用和構造方法正好相反,是對象被銷燬時被自動調用的,做用是釋放內存。析構方法沒有參數。程序員

 

 4)__call() :當程序調用一個不存在或不可見的成員方法時,自動觸發執行__call()。它有兩個參數,分別是未訪問到的方法名稱和方法的參數。而第二個參數是數組類型。正則表達式

 

 5)__get() :當程序調用一個未定義或不可見的成員屬性時,自動觸發執行__get()。它有一個參數,表示要調用的屬性的名稱。sql

 

 6)__set():當程序試圖寫入一個不存在或不可見的成員屬性時,PHP就會自動執行__set()。它包含兩個參數,分別表示屬性名稱和屬性值。數據庫

 

 7)__tostring()  :當程序使用echo或print輸出對象時,會自動調用該方法。目的是但願經過該方法將對象轉化爲字符串,再輸出。__tostring() 無參數,可是該方法必須有返回值。編程

 

 8)__clone()  :當程序clone一個對象的時候,能觸發__clone()方法,程序但願經過這個魔術方法實現:不只僅單純地克隆對象,還須要克隆出來的對象擁有原來對象的全部屬性和方法。

 

103. MVC的概念是什麼?

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

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

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

 C存在的目的則是在M和V之間起到調節做用,確保M和V的同步,一旦M改變,V應該能同步更新。

 將M和V分離,就能夠作到同一個網頁,在不一樣節日到來的時候能顯示不一樣的頁面風格,這隻須要提早製做多個視圖層模板頁面,

 而無需更改M層程序。

 MVC作到了編程中的分工合做,代碼的可重用性獲得最大化體現,程序邏輯更加清晰而富有條理,便於後期維護管理。

 

10四、 訪問權限修飾符有哪幾種,對比解釋

 答:一、public 表示公共的,在本類中和子類中以及類外,能夠對其調用

 二、protected表示受保護的,能夠在本類中和子類中調用

 三、private表示私有的,只能在本類中調用

 四、var,效果等同於public

 

10五、 Class關鍵詞前能夠有哪些修飾詞

 a) Final修飾,表示該類是最終的,沒法繼承

 b) Abstract修飾,表示該類是抽象類

 

10六、 做用域操做符在那些場合下使用

 答:做用於操做符的使用場合

 a) 本類中:

  i. self::類常量

  ii. self::靜態屬性

  iii. self::方法()   parent::方法()

 b) 子類中:

  i. parent::類常量

  ii. parent::靜態屬性(public或者protected)

  iii. parent::方法()(public或者protected)

 c) 類外:

  i. 類名::類常量

  ii. 類名::靜態屬性(public)

  iii. 類名::靜態方法(public)

 

10七、 $this,self, parent分別表明什麼?哪些場合下使用

 答:$this表明的是當前對象

 self表明的是當前的類

 parent表明的是當前類的父類

 使用場合:

 $this只能使用在當前類中,經過$this->能夠調用當前類中的屬性和方法;

 self只能在當前類中使用,經過做用域操做符::訪問當前類中的類常量、當前類中的靜態屬性、當前類中的方法;

 parent只能使用在有父類的當前類中,經過做用域操做符::訪問父類中的類常量、父類中的靜態屬性、父類中的方法。

 

10八、 說明是接口、抽象類兩者有何相同和不一樣的地方?

 一、接口是幫助php實現功能意義上的多繼承的,用interface來聲明,其方法沒有方法體,使用implemens關鍵詞來實現接口。

 接口中只能包含抽象方法和類常量,不能夠包含成員屬性。

 二、抽象類是一種不能被實例化的類,只能做父類,用abstract class來定義,抽象類和普通類能夠沒有區別,類中能夠包含成員屬性、類常量、方法。

 子類得用extends來繼承,並且只能是單繼承。

 二者相同點是都不能夠被實例化,都是須要被繼承纔可使用。

 二者的最大區別是接口能夠實現多繼承,而抽象類只能是單繼承。

 接口中不能包含成員屬性,而抽象類中能夠有成員屬性。

 接口中的抽象方法必須是public或者無訪問修飾詞,接口中的抽象方法不能用abstract來修飾。

 抽象類中的方法能夠是普通方法,也能夠是抽象方法,若是是抽象方法,必定須要使用abstract來修飾。

 

10九、 解釋PHP中單例模式?

 又叫作單態模式、單元素模式、singleton pattern。

 單例模式指在PHP的應用程序的範圍內只對指定的類建立一個實例。使用單例模式的類稱爲單例類。

 在php中單例類必需要有一個私有的構造方法,還要有一個私有的魔術克隆方法(該方法體中爲空)

 和一個私有的靜態的成員屬性$_instance.

 私有構造方法防止除自身之外的類來實例化它。私有的方法體爲空的克隆方法防止該類被克隆。

 $_instance用來存儲被自身實例化後的對象。

 還必需要有一個公共的靜態的方法getInstance()。該方法返回已經存儲了實例對象的$_instance。

 

 1十、 什麼是SQL注入?

 SQL注入攻擊是黑客對數據庫進行攻擊的經常使用手段之一。一部分程序員在編寫代碼的時候,

 沒有對用戶輸入數據的合法性進行判斷,注入者能夠在表單中輸入一段數據庫查詢代碼並提交,

 程序將提交的信息拼湊生成一個完整sql語句,服務器被欺騙而執行該條惡意的SQL命令。注入者根據程序返回的結果,

 成功獲取一些敏感數據,甚至控制整個服務器,這就是SQL注入。

111,如何防止SQL注入?(可擴展)

 要對提交的信息進行過濾,對單引號進行轉義。

 首先能夠在php.ini中設置,讓全部的單引號在提交後都進行轉義。或者使用addslashes().

 

1十二、 FCKEditor自動過濾的解決辦法?

 若是您須要編輯模板頁,默認的FCK設置是會去掉<HTML></HTML><BODY></BODY>標籤,並且會給你加上<P></P>標籤的,若是須要保留的話,只要更改下設置能夠了。

 在fckconfig.js裏面有:FCKConfig.FullPage = false ;

 改成:FCKConfig.FullPage = true;

 若是想去掉自動添加<P>的代碼就能夠在這裏設置

 默認是

 FCKConfig.EnterMode = 'p' ;    // p | div | br

 FCKConfig.ShiftEnterMode = 'br' ; // p | div | br

 改爲

 FCKConfig.EnterMode = 'br' ;    // p | div | br

 FCKConfig.ShiftEnterMode = 'p' ; // p | div | br 

 

11三、 $_REQUEST、$_GET、$_POST、$_COOKIE 的關係和區別: 

 1.關係:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的全部內容,是它們的集合體。

 2.經過$_REQUEST獲取變量值,PHP頁面由於不肯定它是哪一種傳值方式,

 所以會根據php.ini中的配置來接收值。

 php.ini裏能夠設置,variables_order = 「GPC」。其含義是GET,POST,COOKIE.

 因此PHP頁面會先從$_GET中獲取,再從$_POST中獲取,而後從$_COOKIE中獲取。

 新得到的值會覆蓋以前獲取到的值。

 所以從表現形式上看,$_REQUEST最後是獲取$_COOKIE中的值,若是$_COOKIE中沒有值,

 會獲取$_POST中的值,若是$_POST沒有獲取到 ,就去$_GET中獲取。

 若是$_GET中也沒有該值,那麼$_REQUEST就返回null。

  

11四、 什麼是多條件查詢(複合查詢),如何實現多條件查詢?(重點)

 如何實現萬能查詢呢?查詢的時候要填寫查詢條件,這些條件會經過表單進行提交。

 首先須要檢查提交的條件是否爲空。若是不爲空,就認爲這個值是要被看成條件,

 咱們就可使用字符串鏈接的方式來組合一個sql查詢語句。

 當執行後獲取查詢結果。

 

115. 文件上傳須要注意哪些細節?怎麼把文件保存到指定目錄?怎麼避免上傳文件重名問題?

 1). 首現要在php.ini中開啓文件上傳;

 2). 在php.ini中有一個容許上傳的最大值,默認是2MB。必要的時候能夠更改;

 3). 上傳表單必定要記住在form標籤中寫上enctype="multipart/form-data";

 4). 提交方式 method 必須是 post;

 5). 設定 type="file" 的表單控件,而且必須具備name屬性值;

 6). 爲了上傳成功,必須保證上傳文件的大小是否超標、文件類型是否符合要求,上傳後存放的路徑是否存在;

 7). 表單提交到接收頁面,接收頁面使用$_FILES來接收上傳的文件。

 $_FILES是個多維數組。第一維下標是上傳控件的name,二維下標分別爲name/type/tmp_name/size/error。分別表明

 文件名、文件類型、上傳到臨時目錄下的臨時文件名、文件大小、是否有錯誤。

 若是是批量上傳,那麼二維下標就是數組,而並不是是字符串。

 8). 文件上傳後是被放置在服務器端臨時路徑下,須要使用move_uploaded_file ()函數,才能夠將上傳後的

 文件保存到指定目錄。

 9). 爲了不上傳文件重名,能夠經過上傳的文件名獲取到文件後綴,而後使用時間戳+文件後綴的方式爲文件從新命名。

116.  使用GD2庫建立圖像的步驟?

 1). 建立一個畫布:

  imagecreate(); 

 2). 設置畫布背景顏色,使用RGB設置顏色:

  imagecolorallocate();

 3). 設置文字顏色:

  imagecolorallocate();

 4). 在畫布上書寫文字:

  imagestring();

 5).  以 JPEG 格式將圖像輸出到瀏覽器或文件:【根據圖片格式不一樣,函數還能夠是imagepng()、imagegif()等】

  imagejpeg();

 6). 清除圖像資源:

  imagedestroy();

 

117.   GD2庫生成縮略圖的步驟是什麼?

 1). 讀取但願生成縮略圖的源圖像,建立圖像對象:【根據圖片格式不一樣,函數也相應不一樣】

  $src_image = imagecreatefromjpeg();

 2). 獲取原圖像的寬度和高度$srcW,$srcH,根據縮放比例計算出新圖像的寬度和高度$dstW、$dstH:

 3). 建立一個真色彩的圖像對象,寬度和高度設置成剛纔計算出的寬度和高度:

  $dst_image = imagecreatetruecolor($dstW,$dstH); 

 4). 拷貝圖像並調整大小:

  imagecopyresized();

 5). 將圖像輸出:【根據圖片格式不一樣,函數也相應不一樣】

  imagejpeg();

 6). 清除圖像資源(將源圖像資源和目標圖像資源都清除)

  imagedestroy();

 

118.   GD2庫給圖片增長水印如何作?

 1. 添加簡單的文本水印:

  利用imagestring()函數就能夠在圖片上寫文本水印。

 2. 增長一個圖形水印:

  1). 讀取但願增長水印的源圖片,建立圖像對象:【根據圖片格式不一樣,函數也相應不一樣】

   $image = imagecreatefromjpeg();

  2). 建立一個水印圖片的圖像對象:

   $watermark = imagecreatefrompng();

  3). 拷貝併合並圖像:

   imagecopymerge();

  4). 將圖像輸出:【根據圖片格式不一樣,函數也相應不一樣】

   imagejpeg();

  5). 清除圖像資源(將源圖像資源和水印圖像資源都清除)

   imagedestroy();

 

119.  什麼是事務?什麼是回滾?事務的做用是什麼?

 事務就是組合起來的幾個獨立的sql操做。若是其中一項失敗,那麼就讓這幾個組合起來的sql操做都

 回退到未執行狀態。這就是事務的回滾。

 mysql中MyISAM存儲引擎的表不支持事務,只有InnoDB 存儲引擎的表才支持事務,爲了讓事務正常執行,

 就須要讓參與事務的全部數據表都設置成innoDB類型。

 事務被包裝在了 BEGIN 和 COMMIT 語句之間。在沒有使用 COMMIT 語句的狀況下,對數據庫的操做不是永久的,

 一旦運行了 ROLLBACK,就會被回退。只有執行了COMMIT,數據表中的信息才被改動。

 事務的目的就是爲了保證數據的完整性。

 

120.  模擬SESSION機制實現數據庫存放會話數據有什麼做用?【重點】

   若是使用默認的SESSION機制,你們都知道默認的SESSION_ID是存放在COOKIE中,用戶的身份是靠SESSION_ID來識別的,

 而COOKIE文件是存放在用戶瀏覽器的客戶端,這樣就會帶來一個問題,當用戶在辦公室選擇一些商品到購物車,

 在準備下訂單付款的時候,用戶選擇了支付寶在線的支付方式,恰巧辦公室的電腦上面沒有安裝支付寶的數字證書,

 而在用戶家裏的電腦安裝過數字證書,因此呢,用戶就須要回家去支付。可是回家登陸商城以後,

 發現購物車中精心挑選的商品都不存在了。這是爲何呢?問題就在家裏電腦上的並無存放SESSION_ID的cookie文件,

 於是就沒法正確的讀取服務器上對應session文件中的數據,因此沒法將原來的選擇的商品息讀取過來。

 這樣的購物車功能給用戶的用戶體驗式很是糟糕的,因此咱們就須要採起模擬SESSION機制使用數據庫來存放會話數據。

121. 什麼是無限極分類?

 要實現無限極分類,數據庫建表是關鍵。

 表結構中至少須要三個字段,若是想避免遞歸循環,那麼須要四個字段。

 1. id ,當前數據的惟一標識;

 2. typename ,類型名稱;

 3. parentid , 當前類型的上一層父類型的id;

 4. path , 其中存儲當前類型的id和它全部父級類型的id。

 這些id之間採用「-」隔開。

 5. 當經過如下sql語句就能夠實現,相同頂級類下的信息都在一塊兒集中顯示。

 select * from 表名 where 條件 order by path;

 

122.    分頁原理是什麼?

 數據分頁須要如下幾個條件:

 1. 參與分頁的總條數 【$msg_count】 ,該值經過數據庫查詢能夠獲取到;

 2. 每頁顯示的條數【$pagesize】 ,這個數值由本身定義;

 3. 當前頁的頁碼數 【$page】,該數值經過地址欄傳遞和接收;

 4. 能夠經過以上資料計算出總頁數 【$pagecount】 ,此處須要藉助ceil();

  【$pagecount = ceil($msg_count/$pagesize);】

 5. 數據庫查詢藉助sql語句中的【limit】來實現數據的變化:

  例如:

  select * from 表名 where 條件 limit $startnum , $pagesize;

  而$startnum = ($page-1)*$pagesize;

 

12三、   如何在smarty模板語言中使用php代碼?

 藉助於兩個smarty內建函數。

 1. inluce_php 函數用於在模板中包含 php 腳本。例如:

 {include_php file="test.php"}

 2. php 標籤容許在模板中直接嵌入 php 腳本。例如:

 {php}

  echo "這個是php內建函數的做用";

 {/php}

 

12四、   請列出至少五個smarty中的變量調節符並說明功能?

 default  例如:{$arr|default:’xxxx’} ,默認變量調節器,當變量爲空時顯示給定的默認值;

 truncate   例如:{$articleTitle|truncate:10} , 切割字符串長度爲指定的長度;

 count_characters   例如:{$articleTitle|count_characters} ,獲取字符串長度;

 strip_tags   例如:  {$articleTitle|strip_tags} ,去除字符串中的全部html標籤;

 date_format  例如:{$smarty.now|date_format(‘’)} ,格式化時間戳。

 

12五、   寫程序實現以下功能:

 a.如何判斷一個字符串中是否存在一個字符?

 echo strstr('abcdefgcd'  , 'cd');

 echo strpos('ab0defgcd'  , 'cd');

 b.如何判斷一個字符串中一個字符出現的次數?

 echo substr_count('abcdefgcd'  , 'cd');

 c.如何去掉一個字符串的最後一個字符

 echo substr('abcdefgcd'  , 0 ,  -1);

12六、 如何使用smarty的緩存、步驟?什麼叫單模板多緩存?

 若是給整個網站開啓緩存,那麼$smarty->caching=1,此時緩存的時間爲smarty.class.php中默認的時間,也就是3600秒。

 若是對每個頁面獨立設置緩存,那麼$smarty->caching=2 ,緩存時間就會跟display的參數模板頁相掛鉤,也就是能夠實現對每一個模板頁設置不一樣的緩存時間。

 用法例如:

 if(!$smarty->is_cached('index.html')) {

  //此處能夠執行數據庫操做

  $smarty->cache_lifetime = 3600*6;

 }

 $smarty->display('index.html');

 

 對於例如新聞單條這樣的頁面,新聞的模板都是一個,若是開啓緩存,那麼全部的新聞單頁的緩存都是一個,根本不會隨着id的變化而變換內容。因此爲了區分不一樣的頁面緩存,須要使用單模板多緩存技術。具體作法是以id做爲display的第二個參數來實現。此外對於具備分頁的列表頁,也必須在display中使用第二個參數,可使用新聞類型id和當前頁面合併成第二個參數。

 

12七、   寫一個遞歸函數完成如下功能:向函數中傳一個多維數組,對數組中全部的值作判斷,若是值是’number’則設置該值爲0?(提示:該題考的是遞歸的應用,由於傳入的數組不肯定是多少維的,因此須要遞歸判斷)

function recursive_array($arr) {
  if(is_array($arr)) {
   foreach($arr as $key=>$value) {
    if(is_array($value)) {
     $arr[$key] = recursive_array($value);
    } else {
     if($value=='number') {
      $arr[$key] = '0';     }
    }
   }
  }
  return $arr;
 } 

 

12八、   使用jquery寫一個全選的例子?

//全選與取消全選
 function selectAll(flag) {
  for(var i=0; i<$("#fonds input").size(); i++) {
   $("#fonds input").get(i).checked=flag;
  }
 }
 //判斷複選框已經被勾選了多少個?
 function checkFonds() {
  var count=0;
  for(var i=0; i<$("#fonds input").size(); i++) {
   if($("#fonds input").get(i).checked==true) {
    count++;
   }
  }
  alert(count);
 }
 //利用後代選擇器和get()來獲取指定的控件
 $(「div a」).get(2)

 

 

 

12九、 請說明smarty中fetch方法的功能?

 Fetch方法能夠獲取到頁面全部的內容,而且賦值到一個變量中。

 若是第四個參數爲true,則等同於display,直接輸出到瀏覽器中。

 若是第四個參數爲false,則不輸出。

 Display方法就是第四個參數爲true的fetch方法。

 Display = Fetch() + echo() 

 

130、   寫出關於文件上傳的相關函數?  

 strrchr($filename , '.');
 explode('.' , $filename);
 end($arr);
 strrpos($filename , '.');
 substr($filename , $pos+1);
 pathinfo($filename , PATHINFO_EXTENSION);
 date(‘YmdHis’)
 time()
 rand();
 mt_rand()
 move_uploaded_file()

 

 

 

13一、   如何將SESSION存放在數據庫中,能夠結合數據表設計說明.

 默認狀況下php.ini中session.save_handler = files,也就是session是以文件形式存儲的。

 若是想更改成數據庫或其它存儲方式,那麼須要更改設置,讓 session.save_handler = user。

 除了在php.ini中配置外,還能夠在PHP頁面中單獨配置,用

 ini_set ('session.save_handler, 'user')來設置session的存儲方式,設置爲用戶自定義存儲方式。

 設置好存儲方式後,須要使用session_set_save_handler()函數。

 該函數是設置用戶級別的session保存過程的函數。該函數有6個參數,這6個參數實際上是6個自定義函數的名稱,分別表明對session的開啓,關閉,讀,寫 ,銷燬,gc(垃圾回收)。

 示例代碼以下:

 function open () { }

 function close() { }

 function read () { }

 function write () {}

 function destroy () {}

 function gc () {}

 session_set_save_handler ("open", "close", "read", "write", "destroy",  "gc");

 session_start();

 如今你就能夠象往常同樣地使用session了。

 數據庫結構以下:

 Session_id , session_value ,expire_time , 分別存儲sessionid的id和值以及失效時間。

 

13二、  經常使用的正則表達式寫法:

 中文:/^[\u4E00-\u9FA5]+$/

 手機號碼:/^(86)?0?1\d{10}$/

 EMAIL:

 /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/

 密碼(安全級別中):

 /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/

 密碼(安全級別高):

 /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/

相關文章
相關標籤/搜索