頂部導航開始 -->

php最新最全筆試題

1. 變量如何定義?如何檢查變量是否定義?如何刪除一個變量?判斷一個變量是否為空的函數?

         isset()

         unset()

         empty()

 

2. 什么是可變變量?

         一個變量的變量名可以動態的設置和使用。

         $a = 'hello' , $$a = 'world',       ${$a}=hello world

 

3. 變量賦值方式有哪幾種?

         1)直接賦值

         2)變量間賦值

         3)引用賦值

 

4. 引用和拷貝有什么區別?

         拷貝是將原來的變量內容復制下來,拷貝后的變量與原來的變量使用各自的內存,互不干擾。

         引用相當于是變量的別名,其實就是用不同的名字訪問同一個變量內容。當改變其中一個變量的值時,另一個也跟著發生變化。


5. php中變量有哪些基本數據類型?

         php支持8種原始數據類型。

         包括:

         四種標量類型(布爾型boolean,整型interger,浮點型float/double , 字符串string)

         兩種復合類型(數組array , 對象object)

         兩種特殊類型(資源resource,NULL)

 

 

6. 其它類型轉換為boolean類型時,哪些被認為是false?

         布爾值false,整型值0, 浮點型值0.0, 空白字符串, 字符串'0', 空數組,特殊數據類型NULL, 沒有設定的變量。

         empty()函數在哪些情況下返回true?

                   布爾值false,

                   整型值0,

                   浮點型值0.0,              

                   空白字符串,

                   字符串'0',

                   array()空數組,

                   特殊數據類型NULL,

                   沒有任何屬性的對象,

                   沒有賦值的變量。


7. 如果定義了一個變量$a ,但是沒有賦初始值

         那么$a==0嗎?              

         $a==false嗎?

         $a==''嗎?

         $a==NULL嗎?

         $a===NULL嗎?                        答:echo=>什么都沒有 , var_dump=>NULL

         empty($b)==true嗎?———————————— echo=>1 , var_dump=>bool(true)

         此時如果輸出$a++是多少?———————     echo=>什么都沒有 , var_dump=>NULL

         如果輸出++$a又是多少?—————————        echo=>1  , var_dump=>int(1)


8. 字符串怎么轉成整數,有幾種方法?怎么實現?

         強制類型轉換: (整型)字符串變量名;

         直接轉換:settype(字符串變量,整型);

         intval(字符串變量);

 

9. 標量數據和數組的最大區別是什么?

         一個標量只能存放一個數據,而數組可以存放多個數據。


10. 常量如何定義? 如何檢測一個常量是否被定義?常量的值只能是哪些數據類型?

         define()//定義常量 , defined()//檢查常量是否定義

         常量的值只能是標量類型的數據。


11. 常量分為系統內置常量和自定義常量。請說出最常見的幾個系統內置常量?

         __FILE__ , __LINE__ , PHP_OS , PHP_VERSION

 

12. 如果定義了兩個相同的常量,前者和后者哪個起作用?

         前者起作用,因為常量一旦定義就不能被重新定義或者取消定義。


13. 常量和變量有哪些區別?

         1)常量前沒有$符號;

         2)常量只能通過define()定義,而不能通過賦值語句定義;

         3)常量可以在任何地方定義和訪問,而變量有全局和局部之分;

         4)常量一旦定義就不能被重新定義或者取消定義,而變量而通過賦值方式重新定義;

         5)常量的值只能是標量數據,而變量的數據庫類型有8種原始數據類型。


14. PHP中常用的幾個預定義的全局數組變量是哪些?

         有9大預定義的內置數組變量:

         $_POST, $_GET, $_REQUEST, $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS

 

15. 在實際開發中,常量最常用于哪些地方?

         1)連接數據庫的信息定義成常量,如數據庫服務器的用戶名、密碼、數據庫名、主機名;

         2)將站點的部分路徑定義成常量,如web絕對路徑,smarty的安裝路徑,model、view或者controller的文件夾路徑;

         3)網站的公共信息,如網站名稱,網站關鍵詞等信息。

 

16. 函數的優越性有哪些?

         提高程序的可維護性

        提高軟件的可靠性

        提高程序的可重用性

        提高程序的開發效率

  

17. 如何定義一個函數?函數名區分大小寫嗎?

         1)使用 function 關鍵字;

         2)函數命名規則和變量一樣,以字母或者下劃線開頭,而不能以數字開頭;

         3)函數名不區分大小寫;

         4)函數名不可以使用已經聲明過的或者系統自建的函數名稱。


18. 什么是變量的能見度 或者 說是變量作用域?

         就是變量在程序中的可作用范圍。根據變量的能見度,變量分為局部變量和全局變量。

  

19. 什么是局部變量和全局變量?函數內是否可以直接調用全局變量?

         局部變量是函數內部定義的變量,其作用域是所在的函數。如果函數外還有一個跟局部變量名字一樣的變量,

         程序會認為它們兩個是完全不同的兩個變量。當退出函數的時候,其中的局部變量就同時被清除。 

         全局變量是定義在所有函數以外的變量,其作用域是整個php文件,但是在用戶自定義的函數內部是無法使用的。

         如果一定要在用戶自定義的函數內部使用全局變量,那么就需要使用global關鍵字聲明。

         也就是說如果在函數內的變量前加上golbal來修飾,那么函數內部就可以訪問到這個全局變量,

         不僅可以利用這個全局變量進行運算而且可以對這個全局變量進行重新賦值。

         全局變量還可以使用 $GLOBALS['var'] 來調用。

 

 

20. global關鍵詞如何使用?預定義的全局變量數組$GLOBALS如何使用?

  

21. 什么是靜態變量?

         如果一個函數內定義的變量前使用關鍵字static來聲明,那么該變量就是靜態變量。

         一般函數內的變量在函數調用結束后,其存儲的數據將被清除,所占的內存空間也被釋放。而使用靜態變量時,

         該變量會在函數第一次被調用時被初始化,初始化后該變量也不會被清除,當再次調用該函數時,這個靜態變量

         不再被初始化,而能保存上次函數執行完后的值。可以說靜態變量在所有對該函數的調用之間共享。

  

22. php中函數傳遞參數的方式有哪些?兩者有什么區別?

         按值傳遞和按地址傳遞(或按引用傳遞)

         (1)按值傳遞:  待傳遞的變量,與傳遞給函數之后的變量是存儲在不同的空間中。所以函數體內對

               該變量值做的修改,不影響原本的變量值。

     (2)按地址傳遞: 使用 & 符號,表明該參數是以地址的方式傳遞值。并不會將主程序中的指定數值或目標變量傳遞給函數,

               而是把該數值或變量的內存儲存區塊地址導入函數之中,所以函數體內的該變量和主程序中的該變量在內存

               中是同一個。函數體做的修改,直接影響到函數體外部的該變量的值。

  

23. 什么是遞歸函數?如何進行遞歸調用?

         遞歸函數其實就是調用自身的函數,但是必須滿足以下兩個條件:

         1)在每一次調用自身時,必須是更接近于最終結果;

         2)必須有一個確定的遞歸終止條件,不會造成死循環。

         舉例說明:

         在實際工作中往往會在遍歷文件夾的時候使用。

         如果有個例子是希望獲取到目錄windows下所有的文件,那么先遍歷windows目錄,如果發現其中還有文件夾,那么就會調用自身,繼續往下尋找,依次類推,

         直到遍歷到再也沒有文件夾為止,這也就是意味著遍歷出來了所有的文件。


24. 判斷一個函數是否存在?

     function_exists( string $function_name )  如果存在,返回true, 不存在則返回 false。

 

25. func()和@func()之間有什么區別?

         第二個函數調用失敗不會報錯,第一個會報錯

 

26. include()和require()函數的用法和區別是什么?include_once()和require_once()呢?

         include和require出現錯誤后的錯誤級別不一樣

         include_once()和require_once()在加載之前要判斷是否已經導入

 

27. 說出前置++和后置++的區別?

         前置++是先將變量增加1,然后在將值賦值給原來的變量;

         后置++是先返回變量的當前值,然后再將變量的當前值增加1.

  

28. 字符串運算符“.”與算術運算符“+”有什么區別?

         當“a”“b”之間使用.時認為是連字符。如果兩者間是+的時候php會認為是一次運算。

         1)如果+號兩邊的字符串是數字組成的,那么會將字符串自動轉為整型;

         2)如果+號兩邊是純粹的字母,那么會輸出0;

         3)如果+號兩邊的字符串是以數字開頭的,那么會截取字符串開頭的數字,然后進行運算。

  

29. 什么是三目(或三元)運算符?

         根據一個表達式的結果在另兩個表達式中選擇一個。

         例如: ($a==true) ? 'good':'bad';

  

30. 控制流程語句有哪些?

         1:三種程序結構    順序結構、分支結構、循環結構

         2:分支: if/esle/esleif/     switch/case/default

         3: switch 需要注意的:

                   case子句中的常量可以是整型、字符串型常量、 或者常量表達式,不允許是變量。

                同一個switch子句中,case的值不能相同,否則只能取到首次出現case中的值。

         4: 循環  for while   do...while

           do...while 后面必須加入分號結尾。

           while 和 do...while 的區別

         5:break 和 continue 的區別。

                   break可以終止循環。

                   continue沒有break強大,只能終止本次循環而進入到下一次循環中。


31. 數組的概念是什么?數組根據索引分為哪兩種,如何區分?數組的賦值方式有哪兩種?

         數組是一個可以存儲一組或一系列數值的變量(復合型變量)

         索引數組(索引值為數字,以0開始)和關聯數組(以字符串作為索引值)

 

         數組的賦值方式有哪兩種?

         數組的聲明方式主要有兩種。

         1.通過array()函數聲明數組;

                   可以通過key=>value的方式分別定義索引和值,也可以不定義數組的索引下標,只給出數組的元素值。

         2.直接為數組元素賦值,不需要調用array()函數。例如:

                   $arr[0] = 1;

                   $arr[1] = 2;

         特別注意:

         數組的下標如果是等價于整數的字符串值(但不能以0開頭),則會被當作整數對待。

            例如: $array[3] 與  $array['3'] 引用的是相同的一個元素,而 $array['03'] 引用的則就是另外的一個元素了。


32.數組如何遍歷?

         ①for循環

         ②foreach循環  ,這是最常用的遍歷方式。用法如下:foreach($arr as $key=>$value){}

         ③list each 和while 配合起來循環


33. foeach數組的時候指針是如何指向的?list()/each()/while()循環數組的時候指針如何指向的呢?

         當foreach開始執行的時候,數組內部的指針會自動指向第一個單元。因為foreach所操作的是指定數組的拷貝,而不是該數組本身。

         而each()一個數組后,數組指針將停留在數組中的下一個單元或者碰到數組結尾時停留在最后一個單元。如果要再次使用each()遍歷數組,必須要使用reset().

         reset()將數組的內部指針倒回到第一個單元并返回第一個數組單元的值。 

 

34. 如何計算數組長度(或者說計算數組中所有元素的個數)?字符串怎么取長度?

         count() -- 計算數組中的元素個數。

         可以使用count(數組名)或者count(數組名,1),如果有第二個參數,并且是數字1,則表示遞歸統計數組元素的個數。

         如果第二個參數是數字0,則等同于只有一個參數的count()函數。

         sizeof() -- count() 的別名

         字符串:strlen()、mb_strlen();


35. 數組中相關的常用函數有哪些?

         1) count --(sizeof別名)— 計算數組中的單元數目或對象中的屬性個數  

                   例如:int count ( mixed $var [, int $mode ] )  $var 通常都是數組類型,任何其它類型都只有一個單元。  $mode 默認值為0. 1為開啟遞歸地對數組計數

         2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 檢查數組中是否存在某個值。

                   如果 needle 是字符串,則比較是區分大小寫的。

                   如果第三個參數 strict 的值為 TRUE 則 in_array() 函數還會檢查 needle 的類型是否和 haystack 中的相同。

         3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 將一個或多個數組的單元合并起來,一個數組中的值附加在前一個數組的后面。返回作為結果的數組。

                   特別注意:如果輸入的數組中有相同的字符串鍵名,則該鍵名后面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,后面的值將不會覆蓋原來的值,而是附加到后面。

                   如果只給了一個數組并且該數組是數字索引的,則鍵名會以連續方式重新索引

 

         4) 數組與字符串之間的轉換

                   (1)explode ( string $separator , string $string [, int $limit ] )  使用一個分隔字符來分隔一個字符串。

                   (2)implode ( string $glue , array $arr )  使用一個連接符將數組中的每個單元連接為一個字符串。

                   join 為 implode 的別名

 

         5) sort(array &$array [, int $sort_flags ]) — 對數組按照值排序,當本函數結束時數組單元將被從最低到最高重新安排。

 

 

36. 數組合并函數array_merge()和數組加法運算$arr + $arr2 的區別是什么?

         array_merge()->使用array_merge(),如果是關聯數組合并,如果數組的鍵名相同,那么后面的值將覆蓋前者;如果是數字索引數組合并,則不覆蓋,而是

         后者附加到前者后面。

         "+"->使用數組加法運算,與array_merge()不同,加法運算不管是關聯數組還是數字索引數組,都是將相同鍵名的的值舍棄,

         也就是只保留首次出現該鍵名的元素,后來的具有相同鍵名的元素都不會被加進來。

 

 

37. 字符串定義的時候單引號和雙引號有什么區別?

 

 

38. echo(),print(),print_r()的區別?

         (1)echo 是語法,Output one or more strings,沒有返回值;

         (2)print 是函數,不能輸出數組和對象,Output a string,print有返回值;

         (3)print_r 是函數,可以輸出數組。print_r是個比較有意思的函數,可以輸出stirng、int、float、

         array、object等,輸出array時會用結構表示,print_r輸出成功時返回true;而且print_r可以通過print_r($str,true)來,使print_r不輸出而返回print_r處理后的值。此外,對于echo和print,基本以使用echo居多,因為其效率比print要高。

 

 

39. 按照功能分類說說都有哪些字符串處理函數?這些函數的作用是什么?

         A. 字符串輸出函數

         (1)echo $a,$b,$c......;  是一個語言結構,而不是一個真正的函數。

         (2)print($a)    本函數輸出字符串。若成功則返回 1,失敗返回 0

         (3)print_r($a)

         (4)var_dump($a); 能輸出類型、長度、值

         B. 去除字符串首尾空格的函數: trim  ltrim  rtrim(別名:chop)   使用第二個參數,還可以去除指定的字符。

         C. 轉義字符串函數:addslashes()

         D. 獲取字符串長度的函數:strlen()

         E. 截取字符串長度的的函數:substr()

         F. 檢索字符串函數: strstr() , strpos()

         G. 替換字符串函數:str_replace()

 

 

40. 請給出以下問題的正確答案?

         1).$arr = array('james', 'tom', 'symfony');請將$arr數組的值用’,’分割并合并成字符串輸出?

                   echo implode(‘,’,$arr);

 

         2).$str = ‘jack,james,tom,symfony’; 請將$str用’,’分割,并把分割后的值放到$arr數組中?

                   $arr = explode(‘,’,$str);

 

         3).$arr = array(3,7,2,1,’d’,’abc’);         請將$arr按照從大到小的順序排序,并保持其鍵值不變?

                   arsort($arr); print_r($arr);

 

         4).$mail = “[email protected]”; 請將此郵箱的域(163.com)取出來并打印,看最多能寫出幾種方法?

                   echo strstr($mail,'163');

                   echo substr($mail,7);

                   $arr = explode("@",$mail); echo $arr[1];

 

         5). 如果有一個字符串,該字符串是“123,234,345,”。請問如何切割掉這個字符串最后一個逗號?

 

         6). 獲取隨機數的函數有哪幾個?mt_rand() 和 rand()哪個執行速度快?

 

 

41.頁面字符出現亂碼,怎么解決?

         1.首先考慮當前文件是不是設置了字符集。查看是不是meta標簽中寫了charset,如果是php頁面還可以看看是不是

         在header()函數中指定了charset;

         例如:

        

         header(“content-type:text/html;charset=utf-8”);

 

         2.如果設置了字符集(也就是charset),那么判斷當前文件保存的編碼格式是否跟頁面設置的字符集保持一致,

         兩者必須保持統一;

 

         3.如果涉及到從數據庫提取數據,那么判斷數據庫查詢時的字符集是否跟當前頁面設置的字符集一致,兩者必須統一,

         例如:mysql_query(“set names utf8”)。

 

 

42. 正則表達式是什么?php中有哪些常用的跟正則相關的函數?請寫出一個email的正則,中國手機號碼和座機號碼的正則表達式?

         正則表達式是用于描述字符排列模式的一種語法規則。正則表達式也叫做模式表達式。

         網站開發中正則表達式最常用于表單提交信息前的客戶端驗證。

         比如驗證用戶名是否輸入正確,密碼輸入是否符合要求,email、手機號碼等信息的輸入是否合法。

         在php中正則表達式主要用于字符串的分割、匹配、查找和替換操作。

        

         preg系列函數可以處理。具體有以下幾個:

        

         string preg_quote ( string str [, string delimiter] )

                   轉義正則表達式字符 正則表達式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。

         preg_replace -- 執行正則表達式的搜索和替換

         mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )

         preg_replace_callback -- 用回調函數執行正則表達式的搜索和替換

         mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )

         preg_split -- 用正則表達式分割字符串

         array preg_split ( string pattern, string subject [, int limit [, int flags]] )

 

        

 

 

43. 如果想過濾掉某個字符串中所有的html標記使用哪個函數?

 

 

44. preg_replace()和 str_ireplace()兩個函數在使用上有什么不同?preg_split()和split()函數如何使用?

 

 

45. 獲取當前時間戳的函數主要有哪些?用PHP打印出今天的時間,格式是2010-12-10 22:21:21?

         用PHP打印出前一天的時間格式是2010-12-10 22:21:21?如何把2010-12-25 10:30:25變成unix時間戳?

 

         echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’));

        

         date('Y-m-d H:i:s',time());

        

         $unix_time = strtotime("2009-9-2 10:30:25");//變成unix時間戳

         echo date("Y-m-d H:i:s",$unix_time);//格式化為正常時間格式

 

 

46.   在url中用get傳值的時候,若中文出現亂碼,應該用哪個函數對中文進行編碼?

         用戶在網站表單提交數據的時候,為了防止腳本攻擊(比如用戶輸入

         使用urlencode()對中文進行編碼,使用urldecode()來解碼。 

         使用htmlspecialchars($_POST[‘title’])來過濾表單傳參就可以避免腳本攻擊。

 

 

47. 連接數據庫操作的步驟是什么?每一步的返回值是什么數據類型?尤其是mysql_query()返回什么數據類型?

 

48. 說說mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之間有什么區別?

         第一個是返回結果集中的一行作為索引數組,第二個是返回關聯數組,而第三個既可以返回索引數組也可以返回關聯數組,取決于它的第二個參數 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默認為MYSQL_BOTH

         $sql =”select * from table1”;

         $result = mysql_query($sql);

         mysql_fetch_array($result, MYSQL_NUM);

 

49. 請說出目前學過的返回是資源的函數?

         答:         mysql_connect();

                   mysql_query();只有這執行select的時候成功,才返回資源,失敗返回FALSE

                   fopen();

 

50. 打開、關閉文件分別是什么函數? 文件讀寫是什么函數?刪除文件是哪個函數?

         判斷一個文件是否存在是哪個函數?新建目錄是哪個函數?

 

 

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

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

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

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

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

         5. 設定 type="file" 的表單控件;

         6.要注意上傳文件的大小MAX_FILE_SIZE、文件類型是否符合要求,上傳后存放的路徑是否存在。

 

         可以通過上傳的文件名獲取到文件后綴,然后使用時間戳+文件后綴的方式為文件重新命名,這樣就避免了重名。

         可以自己設置上傳文件的保存目錄,與文件名拼湊形成一個文件路徑,使用move_uploaded_file(),就可以完成

         將文件保存到指定目錄。

 

 

52. $_FILES是幾維數組?第一維和第二維的索引下標分別是什么?批量上傳文件的時候需要注意什么?

         二維數組。第一維是上傳控件的name,二維下標分別為name/type/tmp_name/size/error.

 

 

53. header()函數主要的功能有哪些?使用過程中注意什么?

         答:

 

54. 文件下載的時候如果使用header()函數?

         答:header("content-type: application/octet-stream;charset=UTF-8"); //在這里加utf-8和在上面定義有什么區別?、??

             header("accept-ranges: bytes");

            header("accept-length: ".filesize($filedir.$filename));

            header("content-disposition: attachment; filename=".$filedir.$filename);

 

 

55. 什么是ajax?ajax的原理是什么?ajax的核心技術是什么?ajax的優缺點是什么?

         ajax是asynchronous javascript and xml的縮寫,是javascript、xml、css、DOM等多個技術的組合。       '$'是jQuery的別名.

 

  頁面中用戶的請求通過ajax引擎異步地與服務器進行通信,服務器將請求的結果返回給這個ajax引擎,

  最后由這個ajax引擎來決定將返回的數據顯示到頁面中的指定位置。Ajax最終實現了在一個頁面的指定位置可以加載另一個頁面所有的輸出內容。

         這樣就實現了一個靜態頁面也能獲取到數據庫中的返回數據信息了。所以ajax技術實現了一個靜態網頁在不刷新整個頁面的情況下與服務器通信,

         減少了用戶等待時間,同時也從而降低了網絡流量,增強了客戶體驗的友好程度。

        

         Ajax的優點是:

         1.  減輕了服務器端負擔,將一部分以前由服務器負擔的工作轉移到客戶端執行,利用客戶端閑置的資源進行處理;

         2.  在只局部刷新的情況下更新頁面,增加了頁面反應速度,使用戶體驗更友好。

         Ajax的缺點是不利于seo推廣優化,因為搜索引擎無法直接訪問到ajax請求的內容。

         ajax的核心技術是XMLHttpRequest,它是javascript中的一個對象。

 

56. jquery是什么?jquery簡化ajax后的方法有哪些?

         jQuery是Javascript的一種框架。

         $.get(),$.post(),$.ajax()。$是jQuery對象的別名。

 

         代碼如下:

         $.post(異步訪問的url地址 , {'參數名' : 參數值} , function(msg){

                   $("#result").html(msg); 

         });

        

         $.get(異步訪問的url地址 , {'參數名' : 參數值} , function(msg){

                   $("#result").html(msg);

         });

 

         $.ajax({

                   type: "post",

                   url: loadUrl,

                   cache:false,

                   data: "參數名=" + 參數值,

                   success: function(msg) {

                            $("#result").html(msg);

                   }

         });

 

 

57. 什么是會話控制?

         簡單地說會話控制就是跟蹤和識別用戶信息的機制。會話控制的思想就是能夠在網站中跟蹤一個變量,通過這個變量,

         系統能識別出相應的用戶信息,根據這個用戶信息可以得知用戶權限,從而展示給用戶適合于其相應權限的頁面內容。

         目前最主要的會話跟蹤方式有cookie,session。

 

58. 會話跟蹤的基本步驟

         1).訪問與當前請求相關的會話對象

         2).查找與會話相關的信息

         3).存儲會話信息

         4).廢棄會話數據

 

59. 使用cookie的注意事項有哪些?

         1) setcookie()之前不可以有任何頁面輸出,就是空格,空白行也不可以;

         2) setcookie()后,在當前頁面調用$_COOKIE['cookiename']不會有輸出,必須刷新或到下一個頁面才可以看到cookie值;

         3) 不同的瀏覽器對cookie處理不同,客戶端可以禁用cookie,瀏覽器也可以閑置cookie的數量,一個瀏覽器能創建的cookie數量最多300個,并且每個不可以超過4kb,

         每個web站點能設置的cookie總數不能超過20個。

         4) cookie是保存在客戶端的,用戶禁用了cookie,那么setcookie就不會起作用了。所以不可以過度依賴cookie。

 

60. 使用session的時候,通過什么來表示當前用戶,從而與其他用戶進行區分?

         sessionid,通過session_id()函數可以取得當前的session_id。

 

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

         cookie是保存在客戶端機器的,對于未設置過期時間的cookie,cookie值會保存在機器的內存中,只要關閉瀏覽器則

         cookie自動消失。如果設置了cookie的過期時間,那么瀏覽器會把cookie以文本文件的形式保存到硬盤中,

         當再次打開瀏覽器時cookie值依然有效。

        

         session是把用戶需要存儲的信息保存在服務器端。每個用戶的session信息就像是鍵值對一樣存儲在服務器端,

         其中的鍵就是sessionid,而值就是用戶需要存儲信息。服務器就是通過sessionid來區分存儲的session信息是

         哪個用戶的。

        

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

 

         session在web開發中具有非常重要的份量。它可以將用戶正確登錄后的信息記錄到服務器的內存中,當用戶以此身份

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

         管理后臺的訪問地址也不能看到頁面內容。通過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的優點:1、代碼重用性高(省代碼)       2、使程序的可維護性高(擴展性)  3、靈活性

           

 

67. 常用的屬性的訪問修飾符有哪些?分別代表什么含義?

         private,protected,public。

        

         類外:public ,var

         子類中:public,protected ,var

         本類中:private,protected,public ,var

         如果不使用這三個關鍵詞,也可以使用var關鍵字。但是var不可以跟權限修飾詞一起使用。var定義的變量,子類中可以訪問到,類外也可以訪問到,相當于public

 

         類前面:只能加final,abstract

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

         方法前面: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. java語言中方法重寫和重載分別代表什么意思?準確說php支持方法的重載嗎?很多參考書中提到的php重載實際上該如何正確理解?

         答:

         php不支持方法的重載,很多書里提到的PHP‘重載’應該是‘重寫’

 

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

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

 

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. 如果一個類是抽象類,而類中的方法都是非抽象的方法,會報錯嗎?

         答:不會報錯,如果一個類是抽象類,其中可以沒有抽象方法,但是一個類中有個方法是抽象方法,那么這個類一定是一個抽象類

 

 

 

 

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

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

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

 

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

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

 

 

96. 什么是單點入口呢?

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

        比如說在上面我們就使用index.php作為程序的單點入口,當然這個是可以由你自己任意控制的。

 

         單點入口有幾大好處:

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

             第二、程序的架構更加清晰明了。

 

 

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. 多態性:

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

            于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。

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

 

101.常見框架

         thinkPHP

         yii

         ZendFramework

         CakePhp

         sy

 

 

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

         1)__autoload() :當程序實例化某個類,而該類沒有在當前文件中被引入。此時會觸發執行__autoload()。程序希望通過該方法,自動引入這個類文件。該方法有一個參數,即就是那個忘記引入的類的名稱。__autoload()方法的工作原理是什么?當程序執行到實例化某個類的時候,如果在實例化前沒有引入這個類文件,那么就自動執行__autoload()函數。這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件后,就執行include或者require來載入該類,然后程序繼續執行,如果這個路徑下不存在該文件時就提示錯誤。使用自動載入的魔術函數可以不必要寫很多個include或者require函數。

 

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

 

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

 

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

 

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

 

         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做到了編程中的分工合作,代碼的可重用性得到最大化體現,程序邏輯更加清晰而富有條理,便于后期維護管理。

 

 

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

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

         2、protected表示受保護的,可以在本類中和子類中調用

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

         4、var,效果等同于public

105、       Class關鍵詞前可以有哪些修飾詞

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

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

 

 

106、       作用域操作符在那些場合下使用

         答:作用于操作符的使用場合

         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)

 

107、       $this,self, parent分別代表什么?哪些場合下使用

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

         self代表的是當前的類

         parent代表的是當前類的父類

         使用場合:

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

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

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

 

108、       說明是接口、抽象類二者有何相同和不同的地方?

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

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

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

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

         兩者相同點是都不可以被實例化,都是需要被繼承才可以使用。

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

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

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

         抽象類中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract來修飾。

 

109、       解釋PHP中單例模式?

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

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

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

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

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

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

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

 

 110、     什么是SQL注入?

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

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

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

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

 

111、   如何防止SQL注入?

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

         首先可以在php.ini中設置,讓所有的單引號在提交后都進行轉義。或者使用addslashes().

 

112、       FCKEditor自動過濾的解決辦法?

         如果您需要編輯模板頁,默認的FCK設置是會去掉

標簽,而且會給你加上標簽的,如果需要保留的話,只要更改下設置可以了。

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

         改為:FCKConfig.FullPage = true;

         如果想去掉自動添加

的代碼就可以在這里設置

         默認是

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

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

         改成

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

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

 

113、       $_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。

                  

 

114、       什么是多條件查詢(復合查詢),如何實現多條件查詢?

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

         首先需要檢查提交的條件是否為空。如果不為空,就認為這個值是要被當作條件,

         我們就可以使用字符串連接的方式來組合一個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;

 

 

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

         借助于兩個smarty內建函數。

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

         {include_php file="test.php"}

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

         {php}

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

         {/php}

        

 

124、   請列出至少五個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(‘’)} ,格式化時間戳。

 

 

125、   寫程序實現如下功能:

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

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

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

 

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

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

 

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

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

 

 

 

126、       如何使用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和當前頁面合并成第二個參數。

 

 

127、   寫一個遞歸函數完成以下功能:向函數中傳一個多維數組,對數組中所有的值做判斷

         ,如果值是’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;

         }       

 

 

128、   使用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)

 

 

129、       請說明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()

 

131、   如何將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和值以及失效時間。

 

132、      常用的正則表達式寫法:

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

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

         EMAIL:

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

         密碼(安全級別中):

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

         密碼(安全級別高):

         /^(\d+[[email protected]#$%^&(){}][\[email protected]#$%^&(){}]*|[[email protected]#$%^&(){}]+\d[\[email protected]#$%^&(){}]*)$/

 

133 Memcached含義

Memcached 是一個高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信。

 


自學php博客
請先登陸后發表評論
  • 最新評論
  • 總共0條評論
  • ? 2014-2016 zixuephp.cn 版權所有
  • ICP證:皖ICP備16012107號
  • 聯系郵箱:[email protected]
  • 交流請加微信:weibobf2899 或掃下方二維碼
双大床红利扑克1手APP