PHP經典面試題,有答案哦

MC811-MM118發表於2021-05-25

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 = '';  
    foreach($b as $v){  
        $v = ord($v);  
        if($v >= 97 && $v<= 122){  
            $v -= 32;  
        }  

        $r .= chr($v);  
    }  

    return $r;  
}  

$a = 'a中你繼續F@#$%^&*(BMDJFDoalsdkfjasl';  
echo 'origin string:'.$a." ";  
echo 'result string:';  
$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'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('is_really_writable'))
{
    function is_really_writable($file){

    // If we're on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE){
        return is_writable($file);
    }

    // For windows servers and safe_mode "on" installations we'll actually
    // write a file then read it. Bah...
    if (is_dir($file)){

        $file = rtrim($file, '/').'/'.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['file'];
    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 = '思源部落格siyuantlw/tlw/sy/俺只是一個打醬油的';
 $str = iconv("GB2312",'UTF-8',$str);
 $str = urlencode($str); 

?>

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


<html>
 <script>
  var ds = '<?php echo $str;?>';
  var dddd= decodeURIComponent (ds);
  alert(dddd);
 </script>
</html>
本作品採用《CC 協議》,轉載必須註明作者和本文連結
如果覺得我寫的不錯,記得和我交流,其實我也有很多不懂,嘻嘻!

相關文章