首頁  >  文章  >  PHP常見面試題型總結(附答案)

PHP常見面試題型總結(附答案)

藏色散人
藏色散人轉載
2019-02-23 11:39:0379592瀏覽

這篇文章為大家總結了一些PHP常見面試題型(附答案),有一定的參考價值,需要的朋友可以參考一下,希望對大家有幫助。

PHP常見面試題型總結(附答案)

記得我第一次面試PHP這個職位的時候,哪個時候剛從學校出來混,不知道啥行情啊,又是零經驗的(這裡插一句,零經驗的,如果你從來都沒接觸過開發一個完整的,或者半成品的項目,公司一般是不會要的,因為公司招你進去,是要你會幫忙做東西,實現公司的業務與業績的提升的)。那時候我就直接說試用期800元了,當然,好多年前的了哈!也是相當低的價位的,所以公司直接就要了! ! !道理很簡單,大家都懂的!

【相關推薦:php面試題(總結)】

在公司裡做項目,成長是一個過程,提升你自己的學習技能更是一個關鍵所在的。進入公司之前,你會有一兩輪的面試與筆試,做我們這個行業的都是這樣,所以除了口語表達能力(能吹)之外,還有一點就是實力能力的,這個也是你的面試題所要體現的。面試題的題型很多,但是都是離不開PHP基礎的。一些剛出來的可能不懂試題的。告訴你一個方法,那時候我真的用了!就是把所有題型都背下來了!方法很老套又不切實際。但很有用,因為常見的題型都遇到了~~可能是幸運吧!

可能學習各有各的方法!我以前就是那樣子過來的!現在呢,還是要繼續的學習與提陞技能,活到老學到老!一旦進坑了,很難出來!

以下推薦一些面試常見的試題,希望對你有用! !

1、冒泡排序,面試前一定要記得!

function maopao($arr)
{
    $len = count($arr);
    $n = count($arr) - 1;
    for ($i = 0; $i < $len; $i++) {
        for ($j = 0; $j < $n; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
        }
    }
    return $arr;
}

2、快速排序,面試前一定要記得!

function quick_sort($array) {
    if (count($array) <= 1) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i<count($array); $i++){
        if ($array[$i] <= $key)
            $left_arr[] = $array[$i];
        else
            $right_arr[] = $array[$i];
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}

3、請說明PHP 中傳值與傳引用的區別,什麼時候傳值什麼時候傳引用?

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

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

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

4、MySQL資料庫中的欄位型別varchar和char的主要差異是什麼?

##Varchar是變長,節省儲存空間,char是固定長度。找出效率要char型快,因為varchar是非定長,必須先找長度,然後進行資料的擷取,比char定長型別多了一個步驟,所以效率低一些。

5、MySQL資料庫的常用儲存引擎以及它們的差異?

MyISAM:不支援事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,支援全文索引。

InnoDB:支援事務,行鎖,有崩潰復原能力。讀寫速度比MyISAM慢,5.6之後支援全文索引。

儲存引擎是基於表格的,而不是資料庫

(這題還能更詳細點就詳細點)

6、對於大流量的網站,採用什麼樣的方法來解決訪問量問題?

首先,確認伺服器硬體是否足夠支援目前的流量

其次,優化資料庫存取。

第三,禁止外部的盜鏈。

第四,控制大檔案的下載。

第五,使用不同主機分流主要流量

第六,使用流量分析統計軟體

第七,盡量使用靜態頁,快取

7、什麼是物件導向?主要特徵是什麼?

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

8、SESSION 與 COOKIE的差別是什麼?這是重點

SESSION儲存在伺服器端,COOKIE保存在客戶端。 Session比較安全,cookie用某些手段可以修改,不安全。 Session依賴cookie進行傳遞。停用cookie後,session還可以使用,在儲存session的檔案中,產生sessionID,透過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中取得資料。

建議查找session與cookie這方面的詳細教學

9、對快取技術的了解? redis是個考點

1、快取技術是將動態內容快取到文件中,在一定時間內存取動態頁面直接呼叫快取文件,而不必重新存取資料庫。

2、使用memcache可以做快取。

10、表單中get和post提交方式的區別

get是明確的,資料從url中可以看到,傳輸的資料量小,安全性低;

post是隱式的,傳送的資料量較大,安全性較高

##11、最佳化資料庫的方法

選取最適用的欄位屬性,盡可能減少定義欄位寬度,盡量把欄位設定NOTNULL

使用連接(JOIN)來取代子查詢

適用聯合(UNION)來取代手動建立的暫存資料表

交易處理

鎖定表、最佳化交易處理

#使用外鍵,最佳化鎖定表

使用索引

優化查詢語句

12、語句include和require的差別是什麼?語句include和require的差別是什麼?

require是無條件包含,也就是如果一個流程裡加入require,無論條件成立與否都會先執行require,當檔案不存在或無法開啟的時候,會提示錯誤,並且會終止程式執行

include有回傳值,而require沒有(可能因為如此require的速度比include快),如果被包含的檔案不存在的化,那麼會提示一個錯誤,但是程式會繼續執行下去

13、redis和memcacahe、mongoDB的差別?

都是非關係型資料庫,效能都非常高,但是mongoDB和memcache、redis是不同的兩種型別。後兩者主要用於資料的緩存,前者主要用在查詢和儲存大數據方面,是最接近資料庫的文檔型的非關聯式資料庫。

從資料儲存位置上來分,memcache的資料存在記憶體中,而redis既可以儲存在記憶體中,也可以儲存的到磁碟中,達到持久化儲存的功能,memcache一旦斷電,數據全部遺失,redis可以利用快照和AOF把資料存到磁碟中,當恢復時又從磁碟讀取到記憶體中,當物理記憶體使用完畢後,可以把資料寫入磁碟中。

從儲存資料的類型上來分,memcache和redis儲存的方式都是鍵值對,只不過redis值的類型比較豐富,有string(字串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要儲存的是字串。

14、PHP的基本變數類型

# 四種標量類型:boolean (布林類型)、integer (整數)、float (浮點型, 也稱為double)、string (字串)

兩種複合型別:array (陣列)、object (物件)

最後是兩種特殊型別:resource(資源)、NULL(NULL)

15、靜態化如何實現的?偽靜態如何實作?

1、 靜態化指的是頁面靜態化,也即產生實實在在的靜態文件,也即不需要查詢資料庫就可以直接從文件中獲取數據,指的是真靜態。

實作方式主要有兩種:

一種是我們在新增資訊入庫的時候就產生的靜態文件,也稱為模板替換技術。

一種是使用者在造訪我們的頁面時先判斷是否有對應的快取檔案存在,如果存在就讀緩存,不存在就讀資料庫,同時產生快取檔案。

2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智
主要有两种方式:

一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。

另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

16、Mysql的读写分离?(进阶的会遇到)

读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。当然为了保证多台数据库数据的一致性,需要主从复制。

17、如何处理负载,高并发?

1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
3、数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

18、说一下单引号双引号?(基础考点)

单引号内部的变量不会执行, 双引号会执行

单引号解析速度比双引号快。

单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。

19、PHP7的新特性?重点

标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

返回值类型声明:增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

NULL 合并运算符:由于日常使用中存在大量同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

use 加强:从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了

匿名类:现在支持通过new class 来实例化一个匿名类

20、PHP 数组排序

sort() - 以升序对数组排序

rsort() - 以降序对数组排序

asort() - 根据值,以升序对关联数组进行排序

ksort() - 根据键,以升序对关联数组进行排序

arsort() - 根据值,以降序对关联数组进行排序

krsort() - 根据键,以降序对关联数组进行排序

21、建立索引

(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))
(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])

22、PHP支持多继承吗?

不支持。PHP中只允许单继承,父类可以被一个子类用关键字“extends”继承。

23、使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?

Memcahce是把所有的数据保存在内存当中,采用hash表的方式,每条数据又key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。

24、优化MYSQL数据库的方法

(1)选择最有效率的表名顺序
(2)WHERE子句中的连接顺序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替换HAVING子句
(5)通过内部函数提高SQL效率
(6)避免在索引列上使用计算。
(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

(1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL
(2).使用连接(JOIN)来代替子查询(Sub-Queries)
(3).使用联合(UNION)来代替手动创建的临时表
(4).尽量少使用 LIKE 关键字和通配符
(5).使用事务和外键

25、MySQL主从备份的原理?

mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。

26、error_reporting() 的作用?

设置 PHP 的报错级别并返回当前级别。

27、如何修改session的生存时间

在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间

代码实现

$lifeTime = 24 * 3600;  // 保存一天 
session_set_cookie_params($lifeTime); 
session_start();

28、常见的 PHP 安全性攻击

SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止

使用mysql_real_escape_string()过滤数据

手动检查每一数据是否为正确的数据类型

使用预处理语句并绑定变量

参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。

XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。

CSRF:跨站點請求偽造,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但是是偽造的
防止:一般來說,確保用戶來自你的表單,並且匹配每一個你發送出去的表單。有兩點一定要記住:

對使用者會話採用適當的安全措施,例如:給每一個會話更新id和使用者使用SSL。

產生另一個一次性的令牌並將其嵌入表單,保存在會話中(一個會話變數),在提交時檢查它。如laravel中的 _token

程式碼注入:程式碼注入是利用電腦漏洞透過處理無效資料所造成的。問題出在,當你不小心執行任意程式碼,通常透過檔案包含。寫得很糟糕的程式碼可以允許一個遠端檔案包含並執行。如許多PHP函數,如require可以包含URL或檔名。
防止程式碼注入

過濾使用者輸入

在php.ini設定停用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠端檔案

題型還有很多,希望大家在學習過程中,慢慢的去發現和慢慢的提升自己的學習技能,最後祝大家學習愉快! !

陳述:
本文轉載於:php自学中心。如有侵權,請聯絡admin@php.cn刪除