面试题总结(21-40)
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. 字符串定義的時候單引號和雙引號有什么區別?(重點)
一般用單引號或雙引號標識一個字符串。單引號串與雙引號串,在PHP中的處理是不同的。雙引號中的內容可以被解釋并被替換,單引號串中的內容則被作為普通字符處理。
例如:
$str=6; ?
echo "str is $str\n"; ?
echo 'str is $str\n'; ?
?
輸出結果為
str is 6
str is $str\n
注:單引號中輸出的內容是“所見即所得”的,無論有無變量,都被當做普通字符原樣輸出。
說明:在定義簡單的字符串時,使用單引號是一個更加合適的處理方式。如果使用雙引號,php將花費一下時間來處理字符串的轉義和變量的解析。因此,建議在定義字符串時,如果沒有特別的要求應盡量使用單引號。
?
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 = “gaofei@163.com”; 請將此郵箱的域(163.com)取出來并打印,看最多能寫出幾種方法?
? echo strstr($mail,'163');
? echo substr($mail,7);
? $arr = explode("@",$mail); echo $arr[1];
?5). 如果有一個字符串,該字符串是“123,234,345,”。請問如何切割掉這個字符串最后一個逗號? echo rtrim($str, ",");
?6). 獲取隨機數的函數有哪幾個?mt_rand() 和 rand()哪個執行速度快?
對比:
? ? ?mt_rand()是更好地隨機數生成器,因為它跟rand()相比播下了一個更好地隨機數種子;而且性能上比rand()快4倍,mt_getrandmax()所表示的數值范圍也更大
?
轉載于:https://www.cnblogs.com/zwt0626/p/9049233.html
總結
以上是生活随笔為你收集整理的面试题总结(21-40)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: go语言练习:幂、函授接收和返回参数、转
- 下一篇: Lumen、Laravel开发问题记录
