php面試題總結

  • 使用awk統計目錄數量:
[root@wadeyu nginx-1.15.11]# ll | awk -F ' ' 'BEGIN {cnt=0} {print $0; if(index($1, "d")==1){cnt++;}} END {print "cnt:", cnt;}'
  • echo, print, print_r, var_dump, var_export區別
  • echo: 語言結構,輸出一個或多個字符串,沒有返回值
  • print: 語言結構,只支持一個參數,有返回值且爲1
  • print_r: 函數,以易於理解(人類易讀)的格式打印/返回變量內容
  • var_dump: 函數,打印變量的相關信息,包括類型和值
  • var_export: 函數,輸出/返回變量合法的php代碼字符串
 
  • include, require, include_once, require_once區別
  • include:
    • 1.語言結構,包含並運行指定文件,文件不存在時,發出E_WARNING級別的警告錯誤,腳本會繼續執行;
    • 2.失敗時返回false,成功時,若腳本中未顯示指定返回值則返回true;
    • 3.被包含文件的做用域範圍跟include語句所在的行做用域同樣,函數和類是全局做用域;
    • 4.相對路徑搜索規則:step1: include_path指定的路徑下尋找; step2: 調用腳本文件所在的目錄尋找; step3: 執行程序當前的工做目錄尋找;
    • 5.非php指令(<?php xxx; ?>)包含的內容,會當作普通文本輸出;
  • require: 幾乎跟include同樣,被包含的文件不存在時,會報E_COMPILE_ERROR級別的錯誤,會中斷腳本執行
  • include_once: 跟include語句相似,只會包含一次文件,對已包含的文件不會再次包含,若被包含的文件有返回值,第一次包含會獲得返回值,第二次包含會返回true
  • require_once:跟require語句相似,同一個文件屢次包含,只會包含一次,如有返回值,第一次包含會正常返回,後面包含返回true
 
  • 類自動加載機制
  • 1.實現__autoload函數,自定義加載類,參數是類名,php>=7.2不建議使用
  • 2.使用spl_autoload_register函數註冊任意數量的類的自動加載器,該函數會把註冊的自動加載器加入到__autoload函數隊列中,按定義時的順序逐個執行
 
  • 斐波那契數列遞歸優化
  • 優化前的版本
    • 參數很大時,會有棧溢出的風險
function fib(int $n){
    if ($n < 3){
        return 1;
    }
    return fib($n-1) + fib($n-2);
}
  • 優化後的版本
    • 使用尾遞歸
function fibVer2(int $start, int $n, int $prev1 = 1, int $prev2 = 1){
    if ($n < 3){
        return 1;
    }
    if ($start >= $n - 2){
        return $prev1 + $prev2;
    }
    return fibVer2($start+1, $n, $prev2, $prev1 + $prev2);
}
  • 模擬搖色子,根據設置的機率返回對應的點數,好比1,2,3,4,5機率是10%,6點的機率是百分之50
  • 根據數字範圍區間近似計算機率
function getBetNum(array $aBetRate = array()){
    $total = array_sum($aBetRate);
    $rand = mt_rand(0, $total);
    $range = 0;
    foreach($aBetRate as $num => $rate){
        $range += $rate;
        if($rand <= $range){
            return $num;
        }
    }
    return -1;
}
  • 判斷是否合法的電話號碼
function isValidPhone($phone){
    return preg_match('/(^\d{3,4}\s*\-\s*\d{8}$)|(^1\d{10}$)/', $phone) === 1;
}

// 測試用例
$aPhone = ['0791-12341234', '0791 -  12341234', '010-81234123', '010 - 81234123', '123-a1133333', '15817423635', '23423423412', '1567894']; 
foreach($aPhone as $phone){
    echo $phone, ',result:', (isValidPhone($phone) ? 'valid' : 'invalid'), "\n";
}
  • 類中有哪些魔術方法以及用途
  • __construct([mixed $args[,...]]):void 構造函數,每次建立新對象時調用的方法,很是適合使用對象以前作一些初始化工做
  • __destruct(void):void 析構函數,對象被銷燬時執行
  • __set(string $name, mixed $value):void 對對象不存在屬性賦值時被調用
  • __get(string $name):mixed 訪問對象不存在屬性時被調用
  • __isset(string $name):bool 對對象不存在屬性使用isset或者empty判斷時被調用
  • __unset(string $name):void 對對象不存在熟悉使用unset時被調用
  • __call(string $name, array $arguments):mixed 調用對象中不存在的方法是被調用
  • static __callStatic(string $name, array $arguments):mixed 在靜態上下文中調用一個不可訪問方法時被調用
  • __sleep(void):array 使用serialize函數序列化對象以前被調用,能夠用於清理對象,並返回一個對象中應被序列化的變量名稱的數組。
  • __wakeup(void):void 使用unserialize函數反序列化時,首先會檢查是否存在__wakeup魔術方法,若是存在則被調用,用於預先準備對象須要的資源
  • __toString ( void ):string 一個對象被當作字符串時,該怎麼處理,必須返回字符串
  • __invoke ([ $... ] ):mixed 對象當作函數來使用時被調用
  • static __set_state ( array $properties ):object 使用var_export導出對象時,靜態方法被調用,參數是對象屬性列表
  • __debugInfo ( void ):array 使用var_dump函數打印對象以前被調用,返回的內容就是var_dump打印的內容
 
  • 設置cookie一小時過時使用time()+3600仍是gmtime()+3600?
  • 能夠設置cookie的函數: setcookie 內容會urlencode,setrawcookie 發生原始內容,不會被urlencode
  • 過時時間須要傳unix時間戳,因此應使用跟時區無關的函數time()+3600
  • gmtime函數:內置擴展中不包括此函數 :(

參考資料

相關文章
相關標籤/搜索