程式設計師找工作必備 PHP 基礎面試題 - 第十五天

viphper發表於2020-03-28

“PHP學習網” 公眾號會每天分享一些面試題,正在找工作的小夥伴們可以來看看哦。

一、寫出面相物件的三大特性以及定義?

封裝 繼承 多型
封裝:物件以外的部分不能隨意存取物件內部資料
繼承:透過子類繼承父類進行功能擴充套件
多型:對具有繼承關係的不同類物件,可以對相同名稱的成員函式呼叫,產生不同的反應效果

二、用PHP程式寫出5種以上方式獲取一個檔案的副檔名?

//第1種方法
substr(strrchr($file, ‘.’), 1);

//第2種方法
substr($file, strrpos($file, ‘.’)+1);

//第3種方法
end(explode(‘.’, $file));

//第4種方法
$info = pathinfo($file);
echo $info[‘extension’];

//第5種方法
pathinfo($file, PATHINFO_EXTENSION);

三、寫出以下PHP程式的執行結果

<?
$count=5;
function get_count(){
    static $count=0;
    return ++$count;
}
echo $count;
echo $count++;
echo $count;
echo get_count();
echo get_count();
?>
輸出為:5 5 6 1 2

四、寫出下列程式碼的輸出結果:

function myfunc($argument){
    echo $argunment + 10;
}
$variable = 10;
echomyfunc($variable)=.myfunc($variable);

先呼叫函式輸出,後輸出字串
輸出為: 20myfunc(10)=

五、請用盡可能少的語句實現對輸出Email地址進行驗證的功能

'/[0-9a-zA-Z_]+@[0-9a-zA-Z_]\.com|\.net|\.cn/ism'

六、php是否有安全問題,如果有,請列舉說明。

1.過濾使用者輸入的值 比如從post和get傳參得來的值
例:$_POST[‘user’];不過濾,會造成一連串的麻煩

2.禁用register_globals 如果不禁止,就無法確定該變數是否是預定義全域性變數裡的值
例:regiseter_globals=on $var 會代替掉 $_POST[‘var’]

3.防止sql注入
使用 mysql_real_escape_string() 作為使用者輸入的包裝器,就可以避免使用者輸入中的任何惡意 SQL 注入

: $sql = "select count(*) as ctr from users where username='".mysql_real_
_string($username)."' and password='". mysql_real_escape_string($pw)."'
limit 1";

七、如何判斷SQL語句的執行效率?如何最佳化一個查詢SQL?

使用explain檢視sql語句
最主要的檢視type和Extra的值
  1. 避免全表掃描
  2. 以下操作不當也會造成全表掃描
  3. 避免在where子句中使用!=或<>運算子, 還有null值的判斷全表掃描
  4. 避免在where子句中使用or in not in
  5. 避免在where子句中對欄位使用函式操作
  6. 不要寫一些沒有意義的查詢
  7. 索引儘量不要過多

八、一群猴子排成一圈,按1,2,…,n依次編號,然後從第一個開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,再把它踢出去,……。如此不停的進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m,n,?輸出最後那個大王的編號。

這題和擊鼓傳花一樣,可以用佇列的思路實現

//註釋不要抄,幫助理解
function king($m ,$n)
{
//構造陣列
for($i=1 ;$i<$m+1 ;$i++){
   $arr[] = $i ;
}
$i = 0 ;    //設定陣列指標

while(count($arr)>1)
{
   //遍歷陣列,判斷當前猴子是否為出局序號,如果是則出局,否則放到陣列最後
   if(($i+1)%$n ==0) {
    unset($arr[$i]) ;
   } else {
    array_push($arr ,$arr[$i]) ; //本輪非出局猴子放陣列尾部
    unset($arr[$i]) ;   //刪除
   }
   $i++ ;
}
return $arr ;
}

var_dump(king(6,4));

或者

public static function play($first,$m,$k)
  {
   //先要找到是後一個節點
   $tail=$first;
   while ($tail->next!=$first)
    $tail=$tail->next;
   //從第幾個人開始數就要將這個人設為頭節點,也要找到它的後一個結點,作作輔助結點。
   for($i=0;$i<$k-1;$i++)
   {
    $first=$first->next;
    $tail=$tail->next;
   }
   while($tail!=$first)
   {
    //找到要移出的結點。
    for($j=0;$j<$m-1;$j++)
    {
     $first=$first->next;
     $tail=$tail->next;
    }
    //刪除節點
    echo '小孩'.$first->no.'被移除'.'<br>';
    $first=$first->next;
    $tail->next=$first;
   }
   echo '大王是:'.$first->no;
  }
 }

附加題

1、一們獵人帶著一隻兒狼,一隻羊和一捆白菜過河,但他一次只能帶三者中的一者過河。問:他怎樣過河才能不至於讓兒狼吃掉羊或讓羊吃掉白菜

先帶羊 後帶白菜 再帶狼

2、用小圓爐烤兩個餅,每個餅正反面都要烤,而每烤一面所需要的時間是半分鐘,怎樣在一分半鐘烤好三個餅?

a餅 b餅 烤 半分鐘 把b拿掉 換上c餅 a餅反面 烤 半分鐘 再把a餅拿掉 換上b餅反面 c餅反面 烤半分鐘

3、一隻青蛙掉進一口18英尺深的井,每天白天它向上爬6英尺,晚上向下滑3英尺。按照這個速度多少天可以爬出井口?

5天 第五天白天爬出井口

最後各位可以掃下方二維碼關注我公眾號,目前我正在更新基礎面試題,之後會更新中高階、redis、liunx面試題

本作品採用《CC 協議》,轉載必須註明作者和本文連結
和PHP學習網一起努力學習

相關文章