2020最新PHP面試100題(一)
一、什麼是面向物件?主要特徵是什麼?
面向物件是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特徵:封裝、繼承、多型。
二、SESSION 與 COOKIE的區別是什麼,請從協議,產生的原因與作用說明?
-
http無狀態協議,不能區分使用者是否是從同一個網站上來的,同一個使用者請求不同的頁面不能看做是同一個使用者。
-
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
三十二、說說你對快取技術的瞭解?
-
快取技術是將動態內容快取到檔案中,在一定時間內訪問動態頁面直接呼叫快取檔案,而不必重新訪問資料庫。
-
使用memcache可以做快取。
三十三、你所知道的設計模式有哪些?
工廠模式、策略模式、單元素模式、觀察者模式、命令鏈模式
三十四、說說你對程式碼管理的瞭解? 常使用那些程式碼版本控制軟體?
通常一個專案是由一個團隊去開發,每個人將自己寫好的程式碼提交到版本伺服器,由專案負責人按照版本進行管理,方便版本的控制,提高開發效率,保證需要時可以回到舊版本。
常用的版本控制器:SVN
點關注,不迷路
好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以
更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的 PHP技術交流群