php面试题目100及最佳答案,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
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
$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
if($array[$i]==$k){
break;
}
}
if ($i
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中只能包含大于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(
file)
C) function __autoload($class_name)
D) function _autoload($class_name)
E) function autoload(
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和文檔,如果有需要的可以
在這里插入圖片描述
在這里插入圖片描述
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的
總結
以上是生活随笔為你收集整理的php面试题目100及最佳答案,2020最新PHP面试100题(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UNIX网络套接字相关总结
- 下一篇: Ubuntu11.10无法打开softe