php面試題(一)

1.strlen()與mb_strlen()的作用分別是什么?

strlen()和mb_strlen()都是作用于字符串長度的,但是mb_strlen()可以在第二個參數(shù)中指定字符編碼,因?yàn)閟trlen()不能正確處理中文字符,得到的只是字符串的字節(jié)數(shù),一個中文字符占三個字節(jié).

[if !supportLists]2.[endif]include和 require 都能把另外一個文件包含到當(dāng)前文件中,他們有什么區(qū)別?include? 和include是_one又有什么區(qū)別?

include和 require的區(qū)別:

include如果引入的文件不存在,試圖往下執(zhí)行,會報warning錯誤,但是下面代碼還會往下執(zhí)行.(如果你不介意引入的文件是否存在,之后的內(nèi)容都要執(zhí)行,就用include)

require如果引入文件不存在會報fatal error,不再繼續(xù)執(zhí)行(如果文件不引人就不往下執(zhí)行,就用require)


include和 include_once的區(qū)別:

include()如果兩次引入相同文件會warning報錯.重復(fù)引入,requier()引入兩次報嚴(yán)重錯誤

include_once()或者requier_once()會自動判斷文件是否以及該被引入,如果引入則不會重復(fù)執(zhí)行,但是缺點(diǎn)是效率比較低.

[if !supportLists]3.[endif]檢測一個變量是否有設(shè)置函數(shù)的函數(shù)是什么?檢測是否為空的函數(shù)是?

isset()

empty()

[if !supportLists]4.[endif]sort() ,asort(), ksort()有什么區(qū)別?分別在什么情況下使用?

sort():根據(jù)數(shù)組元素中的值,以英文字母順序排序,索引會由0到n-1重新編號.

sort()使用情況:當(dāng)數(shù)組索引鍵的值無關(guān)緊要的時候使用他來對數(shù)組進(jìn)行排序

asort():根據(jù)數(shù)組元素的值,以英文字母順序排序,數(shù)組的索引保持和單元的關(guān)聯(lián).

asort()使用情況:主要用于那些單元順序很重要的結(jié)合數(shù)組進(jìn)行排序

ksort():根據(jù)數(shù)組中索引鍵的值,以英文字母順序排序,特別適合用于希望把索引鍵排序的關(guān)聯(lián)數(shù)組

5.在php中error_reporting()這個函數(shù)有什么作用?

設(shè)置php錯誤級別并返回當(dāng)前級別

[if !supportLists]6.[endif]寫個函數(shù)來對二維數(shù)組進(jìn)行排序

function quicksort2($arr){

if(count($arr) >1){

foreach($arr as $k=>$v){

if(is_string($k)){

ksort($arr);

}

if(is_array($v)){

asort($v);

$arr[$k]=$v;

}else{

$arr[$k]=$v;

asort($arr);

}

}

return $arr;

}else{

return $arr;

}

}

8.計算某段字符串中某個字符串出現(xiàn)的次數(shù),例如’dfdsfdsdsfedd’中’g’出現(xiàn)的次數(shù)

substr_count()

9.說出數(shù)組中涉及到的常用函數(shù)

數(shù)組的鍵名和值

array_values($arr)獲得數(shù)組的值

array_keys($arr)獲取數(shù)組的鍵名

in_array(‘a(chǎn)pple’,$arr)在數(shù)組中檢索apple,如果存在則返回真假值

array_search(‘a(chǎn)pple’,$arr);在數(shù)組中檢索apple,如果存在則返回鍵名

array_key_exists(‘a(chǎn)pple’,$arr)檢測給定的鍵名是否存在數(shù)組中

isset($arr[$apple])檢測給定的鍵名是否存在數(shù)組中

數(shù)組的內(nèi)部指針

current($arr);返回數(shù)組中的當(dāng)前單元pos($arr);返回數(shù)組中的當(dāng)前單元key($arr);返回數(shù)組中當(dāng)前單元的鍵名prev($arr);將數(shù)組中的內(nèi)部指針倒回一位next($arr);將數(shù)組中的內(nèi)部指針向前移動一位end($arr);將數(shù)組中的內(nèi)部指針指向最后一個單元reset($arr;將數(shù)組中的內(nèi)部指針指向第一個單元each($arr);將返回數(shù)組當(dāng)前元素的一個鍵名/值的構(gòu)造數(shù)組,并使數(shù)組指針向前移動一位list($key,$value)=each($arr);獲得數(shù)組當(dāng)前元素的鍵名和值

數(shù)組和變量之間轉(zhuǎn)換

extract($arr)用于把數(shù)組中的元素轉(zhuǎn)化成變量導(dǎo)入到當(dāng)前文件中,鍵名當(dāng)做變量名,值作為變量值.

compact(var1,var2,var3);用給定的變量創(chuàng)建一個數(shù)組

三、數(shù)組與棧

array_push($arr,"apple","pear");將一個或多個元素壓入數(shù)組棧的末尾(入棧),返回入棧元素的個數(shù)array_pop($arr);將數(shù)組棧的最后一個元素彈出(出棧)

四、數(shù)組與列隊

array_shift($arr);數(shù)組中的第一個元素移出并作為結(jié)果返回(數(shù)組長度減1,其他元素向前移動一位,數(shù)字鍵名改為從零技術(shù),文字鍵名不變)array_unshift($arr,"a",array(1,2));在數(shù)組的開頭插入一個或多個元素

五、回調(diào)函數(shù)

array_walk($arr,'function','words');使用用戶函數(shù)對數(shù)組中的每個成員進(jìn)行處理(第三個參數(shù)傳遞給回調(diào)函數(shù)function)array_mpa("function",$arr1,$arr2);可以處理多個數(shù)組(當(dāng)使用兩個或更多數(shù)組時,他們的長度應(yīng)該相同)array_filter($arr,"function");使用回調(diào)函數(shù)過濾數(shù)組中的每個元素,如果回調(diào)函數(shù)為TRUE,數(shù)組的當(dāng)前元素會被包含在返回的結(jié)果數(shù)組中,數(shù)組的鍵名保留不變array_reduce($arr,"function","*");轉(zhuǎn)化為單值函數(shù)(*為數(shù)組的第一個值)

六、數(shù)組的排序

通過元素值對數(shù)組排序

sort($arr);由小到大的順序排序(第二個參數(shù)為按什么方式排序)忽略鍵名的數(shù)組排序rsort($arr);由大到小的順序排序(第二個參數(shù)為按什么方式排序)忽略鍵名的數(shù)組排序usort($arr,"function");使用用戶自定義的比較函數(shù)對數(shù)組中的值進(jìn)行排序(function中有兩個參數(shù),0表示相等,正數(shù)表示第一個大于第二個,負(fù)數(shù)表示第一個小于第二個)忽略鍵名的數(shù)組排序asort($arr);由小到大的順序排序(第二個參數(shù)為按什么方式排序)保留鍵名的數(shù)組排序arsort($arr);由大到小的順序排序(第二個參數(shù)為按什么方式排序)保留鍵名的數(shù)組排序uasort($arr,"function");使用用戶自定義的比較函數(shù)對數(shù)組中的值進(jìn)行排序(function中有兩個參數(shù),0表示相等,正數(shù)表示第一個大于第二個,負(fù)數(shù)表示第一個小于第二個)保留鍵名的數(shù)組排序

通過鍵名對數(shù)組排序

ksort($arr);按照鍵名正序排序krsort($arr);按照鍵名逆序排序uksort($arr,"function");使用用戶自定義的比較函數(shù)對數(shù)組中的鍵名進(jìn)行排序(function中有兩個參數(shù),0表示相等,正數(shù)表示第一個大于第二個,負(fù)數(shù)表示第一個小于第二個)

自然排序法排序

natsort($arr);自然排序(忽略鍵名)natcasesort($arr);自然排序(忽略大小寫,忽略鍵名)

七、數(shù)組的計算

數(shù)組元素的求和

array_sum($arr);對數(shù)組內(nèi)部的所有元素做求和運(yùn)算

數(shù)組的合并

array_merge($arr1,$arr2);合并兩個或多個數(shù)組(相同的字符串鍵名,后面的覆蓋前面的,相同的數(shù)字鍵名,后面的不會做覆蓋操作,而是附加到后面)“+”$arr1+$arr2; ?對于相同的鍵名只保留后一個array_merge_recursive($arr1,$arr2);遞歸合并操作,如果數(shù)組中有相同的字符串鍵名,這些值將被合并到一個數(shù)組中去。如果一個值本身是一個數(shù)組,將按照相應(yīng)的鍵名把它合并為另一個數(shù)組。當(dāng)數(shù)組 具有相同的數(shù)組鍵名時,后一個值將不會覆蓋原來的值,而是附加到后面

數(shù)組的差集

array_diff($arr1,$arr2);返回差集結(jié)果數(shù)組array_diff_assoc($arr1,$arr2,$arr3);返回差集結(jié)果數(shù)組,鍵名也做比較

數(shù)組的交集

array_intersect($arr1,$arr2);返回交集結(jié)果數(shù)組array_intersect_assoc($arr1,$arr2);返回交集結(jié)果數(shù)組,鍵名也做比較

八、其他的數(shù)組函數(shù)

range(0,12);創(chuàng)建一個包含指定范圍單元的數(shù)組array_unique($arr);移除數(shù)組中重復(fù)的值,新的數(shù)組中會保留原始的鍵名array_reverse($arr,TRUE);返回一個單元順序與原數(shù)組相反的數(shù)組,如果第二個參數(shù)為TRUE保留原來的鍵名//srand((float)microtime()*10000000);隨機(jī)種子觸發(fā)器array_rand($arr,2);從數(shù)組中隨機(jī)取出一個或 多個元素shuffle($arr);將數(shù)組的順序打亂

本類函數(shù)允許用多種方法來操作數(shù)組和與之交互。數(shù)組的本質(zhì)是儲存,管理和操作一組變量。

PHP支持一維和多維數(shù)組,可以是用戶創(chuàng)建或由另一個函數(shù)創(chuàng)建。有一些特定的數(shù)據(jù)庫處理函數(shù)可以從數(shù)據(jù)庫查詢中生成數(shù)組,還有一些函數(shù)返回數(shù)組。

array_change_key_case— 返回字符串鍵名全為小寫或大寫的數(shù)組

array_chunk— 將一個數(shù)組分割成多個

array_combine— 創(chuàng)建一個數(shù)組,用一個數(shù)組的值作為其鍵名,另一個數(shù)組的值作為其值

array_count_values— 統(tǒng)計數(shù)組中所有的值出現(xiàn)的次數(shù)

array_diff_assoc— 帶索引檢查計算數(shù)組的差集

array_diff_key— 使用鍵名比較計算數(shù)組的差集

array_diff_uassoc— 用用戶提供的回調(diào)函數(shù)做索引檢查來計算數(shù)組的差集

array_diff_ukey— 用回調(diào)函數(shù)對鍵名比較計算數(shù)組的差集

array_diff— 計算數(shù)組的差集

array_fill_keys— Fill an array with values, specifying keys

array_fill— 用給定的值填充數(shù)組

array_filter— 用回調(diào)函數(shù)過濾數(shù)組中的單元

array_flip— 交換數(shù)組中的鍵和值

array_intersect_assoc— 帶索引檢查計算數(shù)組的交集

array_intersect_key— 使用鍵名比較計算數(shù)組的交集

array_intersect_uassoc— 帶索引檢查計算數(shù)組的交集,用回調(diào)函數(shù)比較索引

array_intersect_ukey— 用回調(diào)函數(shù)比較鍵名來計算數(shù)組的交集

array_intersect— 計算數(shù)組的交集

array_key_exists— 檢查給定的鍵名或索引是否存在于數(shù)組中

array_keys— 返回數(shù)組中所有的鍵名

array_map— 將回調(diào)函數(shù)作用到給定數(shù)組的單元上

array_merge_recursive— 遞歸地合并一個或多個數(shù)組

array_merge— 合并一個或多個數(shù)組

array_multisort— 對多個數(shù)組或多維數(shù)組進(jìn)行排序

array_pad— 用值將數(shù)組填補(bǔ)到指定長度

array_pop— 將數(shù)組最后一個單元彈出(出棧)

array_product— 計算數(shù)組中所有值的乘積

array_push— 將一個或多個單元壓入數(shù)組的末尾(入棧)

array_rand— 從數(shù)組中隨機(jī)取出一個或多個單元

array_reduce— 用回調(diào)函數(shù)迭代地將數(shù)組簡化為單一的值

array_reverse— 返回一個單元順序相反的數(shù)組

array_search— 在數(shù)組中搜索給定的值,如果成功則返回相應(yīng)的鍵名

array_shift— 將數(shù)組開頭的單元移出數(shù)組

array_slice— 從數(shù)組中取出一段

array_splice— 把數(shù)組中的一部分去掉并用其它值取代

array_sum— 計算數(shù)組中所有值的和

array_udiff_assoc— 帶索引檢查計算數(shù)組的差集,用回調(diào)函數(shù)比較數(shù)據(jù)

array_udiff_uassoc— 帶索引檢查計算數(shù)組的差集,用回調(diào)函數(shù)比較數(shù)據(jù)和索引

array_udiff— 用回調(diào)函數(shù)比較數(shù)據(jù)來計算數(shù)組的差集

array_uintersect_assoc— 帶索引檢查計算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)

array_uintersect_uassoc— 帶索引檢查計算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)和索引

array_uintersect— 計算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)

array_unique— 移除數(shù)組中重復(fù)的值

array_unshift— 在數(shù)組開頭插入一個或多個單元

array_values— 返回數(shù)組中所有的值

array_walk_recursive— 對數(shù)組中的每個成員遞歸地應(yīng)用用戶函數(shù)

array_walk— 對數(shù)組中的每個成員應(yīng)用用戶函數(shù)

array— 新建一個數(shù)組

arsort— 對數(shù)組進(jìn)行逆向排序并保持索引關(guān)系

asort— 對數(shù)組進(jìn)行排序并保持索引關(guān)系

compact— 建立一個數(shù)組,包括變量名和它們的值

count— 計算數(shù)組中的單元數(shù)目或?qū)ο笾械膶傩詡€數(shù)

current— 返回數(shù)組中的當(dāng)前單元

each— 返回數(shù)組中當(dāng)前的鍵/值對并將數(shù)組指針向前移動一步

end— 將數(shù)組的內(nèi)部指針指向最后一個單元

extract— 從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號表

in_array— 檢查數(shù)組中是否存在某個值

key— 從關(guān)聯(lián)數(shù)組中取得鍵名

krsort— 對數(shù)組按照鍵名逆向排序

ksort— 對數(shù)組按照鍵名排序

list— 把數(shù)組中的值賦給一些變量

natcasesort— 用“自然排序”算法對數(shù)組進(jìn)行不區(qū)分大小寫字母的排序

natsort— 用“自然排序”算法對數(shù)組排序

next— 將數(shù)組中的內(nèi)部指針向前移動一位

pos— current() 的別名

prev— 將數(shù)組的內(nèi)部指針倒回一位

range— 建立一個包含指定范圍單元的數(shù)組

reset— 將數(shù)組的內(nèi)部指針指向第一個單元

rsort— 對數(shù)組逆向排序

shuffle— 將數(shù)組打亂

sizeof— count() 的別名

sort— 對數(shù)組排序

uasort— 使用用戶自定義的比較函數(shù)對數(shù)組中的值進(jìn)行排序并保持索引關(guān)聯(lián)

uksort— 使用用戶自定義的比較函數(shù)對數(shù)組中的鍵名進(jìn)行排序

usort— 使用用戶自定義的比較函數(shù)對數(shù)組中的值進(jìn)行排序


[if !supportLists]10.[endif]字符串的常用函數(shù)

strlen($str)返回字符串長度返回的是字節(jié)數(shù) mb_strlen($str)可以返回中文字符串長度

strtolower($str)字母轉(zhuǎn)小寫

strtoupper($str)字母轉(zhuǎn)大寫

ucfirst($str)首字母轉(zhuǎn)大寫

ucwords($str)每一個單詞的首字母大寫

str_replace(search, replace, str)字符串替換,區(qū)分大小寫

str_ireplace(search,replace,str)字符串替換,不區(qū)分大小寫

htmlspecialchars($str,ENT_NOQUTES)字符串轉(zhuǎn)換成html實(shí)體實(shí)體 ENT_COMPT(默認(rèn)只編譯雙引號)ENT_QUOTES單引號雙引號都編譯,ENT_NOQUOTES不編譯任何引號

trim($str)刪除字符串前后空格

ltrim($str)刪除字符串左側(cè)空格

rtrim($str)刪除字符串右側(cè)的空格

strpos(‘a(chǎn)’,$str)字符串a(chǎn)在字符串中首次的位置

stripos(‘a(chǎn)’,$str)字符串a(chǎn)在字符串中首次的位置,不區(qū)分大小

substr($str,0,3)截取字符串





[if !supportLists]11.[endif]在php中兩個數(shù)組怎么連接到一起

array_merge()如果鍵名相同會把前一個數(shù)組中關(guān)聯(lián)數(shù)組相同的鍵值覆蓋,索引形式的則會河北在一起

array_merge_recursive()函數(shù)會把鍵值相同的值以一個新的關(guān)聯(lián)數(shù)組的形式返回,并以這個鍵值作為二維數(shù)組的鍵值,其他索引形式則不會受影響。


[if !supportLists]12.[endif]php5中魔術(shù)方法函數(shù)有幾個,請舉例說明各自的用法

魔術(shù)方法

__construct()實(shí)例化對象時被調(diào)用

__destuct()當(dāng)刪除一個對象或者對象操作終止是被執(zhí)行

__call()調(diào)用對象不存在方法時被調(diào)用

__get()調(diào)用對象不存在屬性時被調(diào)用

__set()設(shè)置對象不存在屬性時被調(diào)用

__toString()打印一個對象時被調(diào)用

__clone()克隆對象時被調(diào)用

__sleep() serialize之前被調(diào)用,若對象比較大,想做一些刪除在序列化,可以考慮使用該方法

__wakeup() unserialize之前被調(diào)用,做些對象的初始化

__isset()檢測對象是否存在時被調(diào)用

__unset() unset一個對象屬性時被調(diào)用

__set_state()調(diào)用var_export時被調(diào)用,用__set_state的返回值作為var_export的返回值

__autoload()實(shí)例化一個對象時,如果對應(yīng)的類不存在,在該方法被調(diào)用

魔術(shù)常量

__LINE__返回當(dāng)前行號

__FILE__返回當(dāng)前完整的路徑和文件名

__FUNCTION__返回函數(shù)名稱

__CLASS__返回類的名稱

__METHOD__返回類的方法名







13.寫出你知道的幾種設(shè)計模式,并用代碼實(shí)現(xiàn)其中的一種

單例模式

工廠模式

ORM策略模式

適配器模式

裝飾器模式

觀察者模式

設(shè)計模式

注冊模式

原型模式

class Single{

//私有化靜態(tài)屬性

private static $instance = null;

//私有化一個克隆方法

private function __clone(){}

//私有化構(gòu)造方法,防止直接創(chuàng)建對象

private function __construct(){}

//靜態(tài)化一個公共的方法,判斷對象是否生成并返回對象

public function getObj(){

if(!self::$instance) self::$instance = new self();

return self::$instance;

}

}


14.sql語句應(yīng)考慮哪些安全性

[if !supportLists]1.[endif]防止sql注入,對特殊字符進(jìn)行轉(zhuǎn)義(addslashes)或者使用已經(jīng)編譯好的sql語句進(jìn)行變量的綁定

[if !supportLists]2.[endif]當(dāng)sql運(yùn)行出現(xiàn)錯誤的時候,不要把數(shù)據(jù)庫返回的錯誤全部顯示給客戶,以防止泄露服務(wù)器和數(shù)據(jù)庫的相關(guān)信息

3.最小權(quán)限原則,特別不要使用root用戶,為不同類型的動作或者租組建不同的賬戶

15.簡單描述mysql中,索引,主鍵,唯一索引,聯(lián)合索引的區(qū)別,對數(shù)據(jù)庫的性能有什么影響(讀寫兩方面考慮)?

[if !supportLists](1)[endif]索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針.

(2)普通索引(由關(guān)鍵字KEY或INDEX定義的索引)的唯一任務(wù)就是加快對數(shù)據(jù)的訪問速度.

(3)普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值,如果能確定某個數(shù)據(jù)lie值包含彼此不同的值,在為這個數(shù)據(jù)索引創(chuàng)建索引的時候就應(yīng)該用關(guān)鍵字UNIQE把它定義為一個唯一索引,唯一索引可以保證數(shù)據(jù)記錄的唯一性.

(4)主鍵,一個特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用于唯一標(biāo)識一條記錄,是用關(guān)鍵字PRIMARY KEY來創(chuàng)建.

(5)索引可以覆蓋多個數(shù)據(jù)列,如像INDEX索引,這就是聯(lián)合索引

(6)索引可以極大的提高數(shù)據(jù)的查詢速度,但會降低插入刪除更新表的速度,因?yàn)樵趫?zhí)行這些寫操作的時候,還要操作索引文件.

16.有一個留言板,用mysql做數(shù)據(jù)庫,用戶信息包括:用戶名,密碼,email.留言內(nèi)容包括:留言ID,標(biāo)題,內(nèi)容,發(fā)表時間,狀態(tài)(審核,未審核)實(shí)現(xiàn)以下需求

(1)數(shù)據(jù)庫結(jié)構(gòu)

user用戶表

字段名字段說明字段類型索引

user_id用戶idint主鍵索引

user_name用戶名varchar(30)?

user_pass密碼char(30)?

email郵箱varchar(50)?

message留言表

字段名字段說明字段類型索引

user_id用戶idint關(guān)聯(lián)id

message_id留言idint留言id 主鍵id

title標(biāo)題varchar(45)?

content內(nèi)容varchar(255)?

status狀態(tài)int0:未審核 1:審核通過


[if !supportLists](2)[endif]用一個sql語句查詢出發(fā)表留言數(shù)量大于10條的用戶名及留言數(shù)量,查詢結(jié)果按文章數(shù)量降序排序

select u.user_name,count(*) as total from user as u INNER JOIN message as m ON u.user_id = m.user_id group by u.name having total>10 order by total desc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容