1. 程式人生 > 實用技巧 >2020最新PHP面試100題(一)

2020最新PHP面試100題(一)

一、什麼是面向物件?主要特徵是什麼?

面向物件是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特徵:封裝、繼承、多型。

二、SESSION 與 COOKIE的區別是什麼,請從協議,產生的原因與作用說明?

  1. http無狀態協議,不能區分使用者是否是從同一個網站上來的,同一個使用者請求不同的頁面不能看做是同一個使用者。

  2. SESSION儲存在伺服器端,COOKIE儲存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴於cookie進行傳遞。

禁用cookie後,session不能正常使用。Session的缺點:儲存在伺服器端,每次讀取都從伺服器進行讀取,對伺服器有資源消耗。Session儲存在伺服器端的檔案或資料庫中,預設儲存在檔案中,檔案路徑由php配置檔案的session.save_path指定。Session檔案是公有的。

三、HTTP 狀態中302、403、 500程式碼含義?

一二三四五原則: 一. 訊息系列 二 成功系列 三. 重定向系列 四. 請求錯誤系列 五. 伺服器端錯誤系列

302:臨時轉移成功,請求的內容已轉移到新位置 403:禁止訪問 500:伺服器內部錯誤 401代表未授權。

四、Linux 下建立壓縮包,解壓縮包的命令

Tar.gz:

  • 打包: tar czf file.tar.gz file.txt

  • 解壓: tar xzf file.tar.gz

Bz2:

  • 打包: bzip2 [-k] 檔案

  • 解壓: bunzip2 [-k] 檔案

Gzip(只對檔案,不保留原檔案)

  • 打包: gzip file1.txt

  • 解壓: gunzip file1.txt.gz

Zip: -r 對目錄

  • 打包: zip file1.zip file1.txt

  • 解壓: unzip file1.zip

五、請寫出資料型別(int char varchar datetime text)的意思;請問 varchar 和 char有什麼區別?

Int 整數 char 定長字元 Varchar 變長字元 Datetime 日期時間型 Text 文字型 Varchar 與char的區別 char是固定長度的字元型別,分配多少空間,就佔用多長空間。 Varchar是可變長度的字元型別,內容有多大就佔用多大的空間,能有效節省空間。 由於varchar型別是可變的,所以在資料長度改變的時,伺服器要進行額外的操作,所以效率比char型別低。

六、MyISAM 和 InnoDB 的基本區別?索引結構如何實現?

MyISAM型別不支援事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,而InnoDB型別支援事務,行鎖,有崩潰恢復能力。讀寫速度比MyISAM慢。

建立索引:alert table tablename add index (欄位名)

七、不使用cookie向客戶端傳送一個cookie.

理解:session_start()開啟時,生成一個常量 SID,當COOKIE開啟時,這個常量為空,當COOKIE關閉時,這個常量中儲存了PHPSESSID的值。通過在URL後加一個SID引數來傳遞SESSIONID的值,從而使客戶端頁面可以使用SESSION裡面的值。 當客戶端開啟COOKIE和伺服器端開啟SESSION時。 瀏覽器第一次請求,伺服器會向瀏覽器端傳送一個COOKIE裡面儲存SESSIONID. 當瀏覽器第二次請求時,會把已存在

八、isset() 和 empty() 區別

Isset判斷變數是否存在,可以傳入多個變數,若其中一個變數不存在則返回假,empty判斷變數是否為空為假,只可傳一個變數,如果為空為假則返回真。

九、如何在頁面之間傳遞變數(至少兩種方式) ?

GET,POST,COOKIE,SESSION,隱藏表單

十、寫出匹配URL的正則表示式

‘/^(https?|ftps?):\/\/(www)\.([^\.\/]+)\.(com|cn|org)(\/[\w-\.\/\?\%\&\=]*)?/i’

十一、請寫出常見的排序演算法,並用PHP實現氣泡排序,將陣列$a = array()按照從小到大的方式進行排序。

常見的排序演算法: 氣泡排序法、快速排序法、簡單選擇排序法、堆排序法、直接插入排序法、希爾排序法、合併排序法。

氣泡排序法的基本思想是:對待排序記錄關鍵字從後往前(逆序)進行多遍掃描,當發現相鄰兩個關鍵字的次序與排序要求的規則不符時,就將這兩個記錄進行交換。這樣,關鍵字較小的記錄將逐漸從後面向前面移動,就象氣泡在水中向上浮一樣,所以該演算法也稱為氣泡排序法。

// 氣泡排序法
Function mysort($arr){
 For($i=0; $i
  For($j=0; $j
   If($arr[$j] > $arr[$j+1]){
    $tmp=$arr[$j];
    $arr[$j]=$arr[$j+1];
    $arr[$j+1]=$tmp;
            }
        }
    }
 Return $arr;
}
$arr=array(3,2,1);
print_r(mysort($arr));

十二、請說明 PHP 中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?

  • 按值傳遞:函式範圍內對值的任何改變在函式外部都會被忽略

  • 按引用傳遞:函式範圍內對值的任何改變在函式外部也能反映出這些修改

  • 優缺點:按值傳遞時,php必須複製值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。按引用傳遞則不需要複製值,對於效能提高很有好處。

十三、在PHP中error_reporting這個函式有什麼作用?

設定 PHP 的報錯級別並返回當前級別。

請用正則表示式(Regular Expression)寫一個函式驗證電子郵件的格式是否正確。

if(isset($_POST['action']) && $_POST['action']==’submitted’){
 $email=$_POST['email'];
 if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+){1,3}$/”,$email)){
  echo “電子郵件檢測失敗”;
 }else{
  echo “電子郵件檢測成功”;
 }
}

十四、使用PHP描述快速排序演算法,物件可以是一個數組?

原理:快速排序使用分治策略來把待排序資料序列分為兩個子序列,具體步驟為:

(1)從數列中挑出一個元素,稱該元素為“基準”。

(2)掃描一遍數列,將所有比“基準”小的元素排在基準前面,所有比“基準”大的元素排在基準後面。

(3)通過遞迴,將各子序列劃分為更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列排序。

//快速排序(陣列排序)
function QuickSort($arr){
 $num = count($arr);
 $l=$r=0;
 for($i=1;$i<$num;$i++){
  if($arr[$i] < $arr[0]){
   $left[] = $arr[$i];
   $l++;
  }else{
   $right[] = $arr[$i];
   $r++;
  }
 }
 if($l > 1){
  $left = QuickSort($left);
 }
 $new_arr = $left;
 $new_arr[] = $arr[0];
 if($r > 1){
  $right = QuickSort($right);
 }
 for($i=0;$i<$r;$i++){
  $new_arr[] = $right[$i];
 }
 return $new_arr;
}

十五、使用PHP描述順序查詢和二分查詢(也叫做折半查詢)演算法,順序查詢必須考慮效率,物件可以是一個有序陣列

//二分查詢(數組裡查詢某個元素)
function bin_sch($array, $low, $high, $k){
 if ($low <= $high){
  $mid = intval(($low+$high)/2);
  if ($array[$mid] == $k){
   return $mid;
  }elseif ($k < $array[$mid]){
   return bin_sch($array, $low, $mid-1, $k);
  }else{
   return bin_sch($array, $mid+1, $high, $k);
  }
 }
 return -1;
}
//順序查詢(數組裡查詢某個元素)
function seq_sch($array, $n, $k){
 $array[$n] = $k;
 for($i=0; $i<$n; $i++){
  if($array[$i]==$k){
   break;
  }
 }
 if ($i<$n){
  return $i;
 }else{
  return -1;
 }
}

十六、寫一個二維陣列排序演算法函式,能夠具有通用性,可以呼叫php內建函式(array_multisort())

//二維陣列排序, $arr是資料,$keys是排序的健值,$order是排序規則,1是升序,0是降序
function array_sort($arr, $keys, $order=0) {
 if (!is_array($arr)) {
  return false;
 }
 $keysvalue = array();
 foreach($arr as $key => $val) {
  $keysvalue[$key] = $val[$keys];
 }
 if($order == 0){
  asort($keysvalue);
 }else {
  arsort($keysvalue);
 }
 reset($keysvalue);
 foreach($keysvalue as $key => $vals) {
  $keysort[$key] = $key;
 }
 $new_array = array();
 foreach($keysort as $key => $val) {
  $new_array[$key] = $arr[$val];
 }
 return $new_array;
}

十七、請以空格作為間隔,拆分字串’Apple Orange Banana Strawberry’,組成陣列$fruit,

  • 陣列中所有元素都用小寫字母,並按照字母先後次序排序
class sort {
 private $str;
 public function __construct($str) {
  $this->str=strtolower($str);
 }
 private function explodes() {
  if(empty($this->str)) return array();
  $arr=explode(" ",$this->str);
  return is_array($arr)?$arr:array($arr);
 }
 public function sort() {
  $explode=$this->explodes();
  sort($explode);
  return $explode;
 }
}
$str='Apple Orange Banana Strawberry';
$sortob=new sort($str);
var_dump($sortob->sort());

十八、對於使用者輸入一串字串$ string,要求$ string中只能包含大於0的數字和英文逗號,請用正則 表示式驗證,對於不符合要求的$string返回出錯資訊

class regx {
 public static function check($str) {
 if(preg_match("/^([1-9,])+$/",$str)) {
  return true;
 }
 return false;
 }
}
$str="12345,6";
if(regx::check($str)) {
echo "suc";
} else {
echo "fail";
}

十九、請寫一段程式,在伺服器建立一個檔案fruit.dat,將試題3中得到的陣列寫入到改檔案中,然後寫一段程式從檔案中讀取並還原陣列@author zhuwenqiong

class sort {
 private $str;
 public function __construct($str) {
  $this->str=strtolower($str);
 }
 private function explodes(){
  if(empty($this->str)) return array();
  $arr=explode(" ",$this->str);
  return is_array($arr)?$arr:array($arr);
 }
 public function sort() {
  $explode=$this->explodes();
  sort($explode);
  return $explode;
 }
}
class file {
 private $sort=null;
 private $filepath;
 public function __construct($arrobj,$path) {
  $this->sort=$arrobj;
  $this->filepath=$path;
 }
 private function getresource($filename,$mode) {
  return fopen($this->filepath.$filename,$mode);
 }
 private function closeresource($resource) {
  fclose($resource);
 }
 public function savefile($filename) {
  $arr=$this->sort->sort();
  $fopen=$this->getresource($filename,"a+");
  if(!$fopen){
   echo "檔案開啟失敗!";
   exit;
  }
  var_dump($arr);
  foreach($arr as $key=>$value) {
   fwrite($fopen,$value."\n");
  }
  $this->closeresource($fopen);
 }
 public function readfile($filename) {
  $this->savefile($filename);
  $fopen=$this->getresource($filename,"r");
  if(!$fopen){
   echo "檔案開啟失敗!";exit;
  }
  $arr=array();
  while(!feof($fopen)) {
   $get=fgets($fopen);
   if(!empty($get))
    $arr[]=str_replace("\n","",$get);
  }
  $this->closeresource($fopen);
 return $arr;
 }
}
$file=new file(new sort('Apple Orange Banana Strawberry'),"E:\\");
$arr=$file->readfile("fruit.dat");
var_dump($arr);

二十、單例模式,建立mysqli資料庫連結的單例物件

class Db {
 private static $instance;
 public $handle;
 Private function __construct($host,$username,$password,$dbname) {
  $this->handle=NULL;
  $this->getcon($host,$username,$password,$dbname);
 }
 public static function getBb() {
  self::$instance=new Db();
  return self::$instance;
 }
 private function getcon($host,$username,$password,$dbname) {
  if($this->handle!=NULL){
   return true;
  }
  $this->handle=mysqli_connect($host,$username,$password,$dbname);
 }
}

二十一、windows平臺, Apache Http Server啟動失敗, 排錯思路是什麼?

檢查apache使用的80埠是否被佔用,如果被佔用,先停止佔用80埠的服務,然後啟動apache伺服器

二十二、PHP session擴充套件預設將session資料儲存在哪裡? (D)

A) SQLite Database

B) MySQL Database

C) Shared Memory

D) File System

E) Session Server

二十三、如果你想要自動載入類,下面哪種函式宣告是正確的 (C)

A) function autoload($class_name)

B) function __autoload($class_name, $file)

C) function __autoload($class_name)

D) function _autoload($class_name)

E) function autoload($class_name, $file)

二十四、PHP程式使用utf-8編碼, 以下程式輸出結果是什麼? (B)

$str = ’hello你好世界’;
echo strlen($str);
?>

A) 9

B) 13(gbk)

C) 18

D) 17(utf8)

二十五、你所知道的php陣列相關的函式?

array()----建立陣列
array_combine()----通過合併兩個陣列來建立一個新陣列
range()----建立並返回一個包含指定範圍的元素的陣列
compact()----建立一個數組
array_chunk()----將一個數組分割成多個
array_merge()----把兩個或多個數組合併成一個數組
array_slice()----在陣列中根據條件取出一段值
array_diff()----返回兩個陣列的差集陣列
array_intersect()----計算陣列的交集
array_search()----在陣列中搜索給定的值
array_splice()----移除陣列的一部分且替代它
array_key_exists()----判斷某個陣列中是否存在指定的key
shuffle()----把陣列中的元素按隨機順序重新排列
array_flip()----交換陣列中的鍵和值
array_reverse()----將原陣列中的元素順序翻轉,建立新的陣列並返回
array_unique()----移除陣列中重複的值

二十六、php讀取檔案內容的幾種方法和函式?

開啟檔案,然後讀取。Fopen() fread()

開啟讀取一次完成 file_get_contents()

二十七、以下程式,變數str什麼值的情況下輸入111?

if( ! $str ) { echo 111; }

在$str值為:0,’0′,false,null,”"

二十八、你所知道的PHP的一些技術(smarty等)?

Smarty,jquery,ajax,memcache,div+css,js,mysqli,pdo,svn,thinkphp,brophp,yii

二十九、你所熟悉的PHP論壇系統 有哪些?

Discuz

三十、你所熟悉的PHP商城系統 有哪些?

Ecshop

三十一、你所熟悉的PHP開發框架 有哪些?

Brophp,thinkphp

三十二、說說你對快取技術的瞭解?

  1. 快取技術是將動態內容快取到檔案中,在一定時間內訪問動態頁面直接呼叫快取檔案,而不必重新訪問資料庫。

  2. 使用memcache可以做快取。

三十三、你所知道的設計模式有哪些?

工廠模式、策略模式、單元素模式、觀察者模式、命令鏈模式

三十四、說說你對程式碼管理的瞭解? 常使用那些程式碼版本控制軟體?

通常一個專案是由一個團隊去開發,每個人將自己寫好的程式碼提交到版本伺服器,由專案負責人按照版本進行管理,方便版本的控制,提高開發效率,保證需要時可以回到舊版本。

常用的版本控制器:SVN

點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以

點選進入暗號: PHP+「平臺」


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的 PHP技術交流群