首頁  >  文章  >  後端開發  >  七道PHP經典面試題(附答案)

七道PHP經典面試題(附答案)

藏色散人
藏色散人轉載
2021-05-26 13:52:055005瀏覽

這篇文章向大家介紹七道PHP經典面試題(附答案),有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

1.合併兩個陣列有幾種方式,試比較它們的異同

方式:

#1、array_merge()

2、' '

3、array_merge_recursive

異同:

array_merge 簡單的合併數組

array_merge_recursive 合併兩個數組,如果數組中有完全一樣的數據,將它們遞歸併

array_combine 和' ' :合併兩個數組,前者的值作為新數組的鍵

2.請寫一個函數來檢查使用者提交的資料是否為整數(不區分資料類型,可以為二進位、八進位、十進位、十六進位數字)

#「其實主要還是is_int 和floor這個方法

if(!is_numeric($jp_total)||strpos($jp_total,".")!==false){  
    echo "不是整数";  
}else{  
    echo "是整数";  
}

3. PHP 的strtolower () 和strtoupper () 函數在安裝非中文系統的伺服器下可能會導致將漢字轉換為亂碼,請寫兩個替代的函數實作相容Unicode 文字的字串大小寫轉換

答:原因是:中文是由多字節組成的,而只有英文系統的單個英文字符只有一個字節,所以該系統把中文的每一個字節都做了strtolower () 處理,改變後的中文字節拼接在一起就成了亂碼(新生成的編碼映射對應的字符可能就不是中文了)

#手動解決:用str_split (string string,intstring,intsplit_length = 1) 按每個位元組切割,像中文能切割成三個位元組。將辨識到的位元組若是英文字母則進行轉換。

<?php  
function mystrtoupper($a){  
    $b = str_split($a, 1);  
    $r = &#39;&#39;;  
    foreach($b as $v){  
        $v = ord($v);  
        if($v >= 97 && $v<= 122){  
            $v -= 32;  
        }  
        $r .= chr($v);  
    }  
    return $r;  
}  
$a = &#39;a中你继续F@#$%^&*(BMDJFDoalsdkfjasl&#39;;  
echo &#39;origin string:&#39;.$a." ";  
echo &#39;result string:&#39;;  
$r = mystrtoupper($a);  
var_dump($r);

4. PHP 的is_writeable () 函數存在Bug,無法準確判斷一個目錄/ 檔案是否可寫,請寫一個函數來判斷目錄/ 檔案是否絕對可寫

答案:其中bug 存在兩個方面,

1、在windowns 中,當檔案只有唯讀屬性時,is_writeable () 函數才會傳回false,當傳回true 時,該檔案不一定是可寫的。

如果是目錄,在目錄中新建文件並透過開啟文件來判斷;

如果是文件,可以透過開啟文件(fopen),來測試文件是否可寫入。

2、在 Unix 中,當 php 設定檔中開啟 safe_mode 時 (safe_mode=on),is_writeable () 同樣不可用。

讀取設定檔是否 safe_mode 是否開啟。

/**
* Tests for file writability
*
* is_writable() returns TRUE on Windows servers when you really can&#39;t write to
* the file, based on the read-only attribute. is_writable() is also unreliable
* on Unix servers if safe_mode is on.
*
* @access   private
* @return   void
*/
if ( ! function_exists(&#39;is_really_writable&#39;))
{
    function is_really_writable($file){
    // If we&#39;re on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == &#39;/&#39; AND @ini_get("safe_mode") == FALSE){
        return is_writable($file);
    }
    // For windows servers and safe_mode "on" installations we&#39;ll actually
    // write a file then read it. Bah...
    if (is_dir($file)){
        $file = rtrim($file, &#39;/&#39;).&#39;/&#39;.md5(mt_rand(1,100).mt_rand(1,100));
        if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){
            return FALSE;
        }
        fclose($fp);
        @chmod($file, DIR_WRITE_MODE);
        @unlink($file);
        return TRUE;
    } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
        return FALSE;
    }
    fclose($fp);
    return TRUE;
    }
}

5. PHP 的chmod () 函數存在Bug,無法保證設定成功,請寫一個函數在指定路徑下建立目錄/ 檔案並確保可以正確設定權限遮罩

答案:我也找不到答案

6. PHP 處理上傳檔案資訊陣列中的檔案類型$_FILES ['type'] 由客戶端瀏覽器提供,有可能是駭客偽造的訊息,請寫一個函數來確保使用者上傳的圖片檔案類型真實可靠

答案:用getimagesize 來判斷上傳圖片的類型比$_FILES 函數的type 更可靠

同一個文件,使用不同的瀏覽器php 返回的type 類型是不一樣的,由瀏覽器提供type 類型的話,

就有可能被駭客利用向伺服器提交一個偽裝撐圖片後綴的可執行檔。

可以透過getimagesize () 函數來判斷上傳的檔案類型,如果是頭像檔案會傳回這樣的一個陣列

Array(
    [0] => 331
    [1] => 234
    [2] => 3
    [3] => width="331" height="234"
    [bits] => 8
    [mime] => image/png

);

如果透過getimagesize () 函數傳回的是這樣的陣列說明上傳的是頭像檔案。其中索引為2 的表示類型

1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF( motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 =JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM,

你可以透過這個再去限制上傳的頭像類型

<?php
    $file=$_FILES[&#39;file&#39;];
    if(!empty($file))
    {
       var_dump($file);
       var_dump(getimagesize($file["tmp_name"]));
    }   
?>

7. PHP 透過對資料的URL 編碼來實現與Javascript 的資料交互,但是對於部分特殊字元的編解碼與Javascript 的規則不盡相同,請具體說明這種差異,並針對UTF-8 字元集的數據,寫出PHP 的編解碼函數和Javascript 的編解碼函數,確保PHP 編碼資料可以被Javascript 正確解碼、Javascript 編碼的資料可以被PHP 正確解碼

#答案:

<?php
 $str = &#39;思源博客siyuantlw/tlw/sy/俺只是一个打酱油的&#39;;
 $str = iconv("GB2312",&#39;UTF-8&#39;,$str);
 $str = urlencode($str); 
?>

/ /js decodeURIComponent 看起來對GB2312 編碼的格式不識別,必須轉為utf-8 才可以,然後,如果字串中有空格的就轉為號了

<html>
 <script>
  var ds = &#39;<?php echo $str;?>&#39;;
  var dddd= decodeURIComponent (ds);
  alert(dddd);
 </script>
</html>

以上是七道PHP經典面試題(附答案)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除