作為php程式設計師你應該瞭解php知識點
阿新 • • 發佈:2019-01-05
1. 簡述php中的autoload
在PHP中使用類時,我們必須在使用前載入進來,不管是通過require
的方式還是include
的方式,但是會有兩個問題影響我們做出載入的決定。首先是不知道這個類檔案存放在什麼地方,另外一個就是不知道什麼時候需要用到這個檔案。特別是專案檔案特別多時,不可能每個檔案都在開始的部分寫很長一串的 require …Autoload
的載入機制,當通過 new 來例項化一個類時,PHP會通過定義的autoload 函式載入相應的檔案,如果這個類檔案使用了 extends 或者 implements 需要用到其他的類檔案,php會重新執行 autoload 去進行類檔案的查詢和載入,如果發生了兩次對同一類檔案的請求,就會報錯。
2. 靜態變數及有什麼優缺點?
靜態區域性變數的特點: 1.不會隨著函式的呼叫和退出而發生變化,不過,儘管該變數還繼續存在,但不能使用它。倘若再次呼叫定義它的函式時,它又可繼續使用,而且儲存了前次被呼叫後留下的值。2.靜態區域性變數只會初始化一次。3.靜態屬性只能被初始化為一個字元值或一個常量,不能使用表示式。即使區域性靜態變數定義時沒有賦初值,系統會自動賦初值0(對數值型變數)或空字元(對字元變數);靜態變數的初始值為0。4.當多次呼叫一個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的副作用,因此仍以採用區域性靜態變數為宜.
3. strtr
和 str_replace
有什麼區別,兩者分別用在什麼場景下?
str_replace()
函式以其他字元替換字串中的一些字元(區分大小寫)strtr()
函式轉換字串中特定的字元。
5.6版本 str_replace 比 strtr 效率高10+倍, 7.0版本效率基本相同, 但5.6的 str_replace 竟比 7.0高 3倍
4. 魔術方法
__construct()
:類的預設構造方法,如果__construct()和與類同名的方法共同出現時,預設呼叫__construct()而不是同類名方法。__call()
:當呼叫不存在或者不可訪問的方法時,會呼叫__call($name, $arguments)方法。__toString()
:當列印物件時會被直接呼叫。如echo $object;__clone()
:當物件被拷貝時直接呼叫。__isset()
:對不存在或者不可訪問的屬性使用isset()或者empty()時,__isset()會被呼叫;__destruct()
:類的解構函式,當該物件的所有引用都被刪除,或者物件被顯式銷燬時執行。
5. 如下所示,會輸出什麼結果?
foreach ($array as $key => $item) {
$array[$key + 1] = $item + 2;
echo "$item";
}
print_r($array);
結果示例: $array = [3,6,7,8];
3678 //echo 輸出陣列內元素的值
Array
(
[0] => 3 //$key 保持不變
[1] => 5 //每次的$eky + 1,對應的值加2,
[2] => 8
[3] => 9
[4] => 10
)
laravel
- laravel和其他框架對比的優缺點
laravel
- 優點: 使用人數全球第一,文件齊全,框架結構組織清晰,大量第三方擴充套件包供引用,適合大型網站協同開發,提供的artisan開發工具開發效率高。composer擴充套件自動載入,中介軟體
- 缺點:稍複雜,上手比一般框架要慢;大量引用第三方包,但某些場景下我們只使用類中的部分方法,程式碼顯得有些冗餘
ThinkPHP
- 優點:是一個快速、簡單的基於MVC和麵向物件的輕量級PHP開發框架,遵循Apache2開源協議釋出,秉承簡潔實用的設計原則,在保持出色的效能和至簡的程式碼的同時,尤其注重開發體驗和易用性,並且擁有眾多的原創功能和特性,為WEB應用開發提供了強有力的支援。簡單明瞭方便快捷,上手快
- 缺點:缺少面向物件的設計,5的版本基本面向物件,框架社群相關的輔助工具少
Mysql
1. Mysql中,int(10)和int(11)的區別
- BIT[M]位欄位型別,M表示每個值的位數,範圍從1到64,如果M被忽略,預設為1
- TINYINT [(M)] [UNSIGNED] [ZEROFILL] M預設為4。很小的整數。帶符號的範圍是-128到127。無符號的範圍是0到255。
- SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M預設為6。小的整數。帶符號的範圍是-32768到32767。無符號的範圍是0到65535。
- MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M預設為9。中等大小的整數。帶符號的範圍是-8388608到8388607。無符號的範圍是0到16777215。
- INT[(M)] [UNSIGNED] [ZEROFILL] M預設為11。普通大小的整數。帶符號的範圍是-2147483648到2147483647。無符號的範圍是0到4294967295。
- BIGINT[(M)] [UNSIGNED] [ZEROFILL] M預設為20。大整數。帶符號的範圍是-9223372036854775808到9223372036854775807。無符號的範圍是0到18446744073709551615。
注意:這裡的M代表的並不是儲存在資料庫中的具體的長度,以前總是會誤以為int(3)只能儲存3個長度的數字,int(11)就會儲存11個長度的數字,這是大錯特錯的。其實當我們在選擇使用int的型別的時候,不論是int(3)還是int(11),它在資料庫裡面儲存的都是4個位元組的長度,在使用int(3)的時候如果你輸入的是10,會預設給你儲存位010,也就是說這個3代表的是預設的一個長度,當你不足3位時,會幫你不全,當你超過3位時,就沒有任何的影響。
**int(M) M指示最大顯示寬度。最大有效顯示寬度是255。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度
。顯示寬度並不限制可以在列內儲存的值的範圍,也不限制超過列的指定寬度的值的顯示。
2.索引左原則:
- like,匹配字串時,不以萬用字元開頭,左側必須固定,該欄位索引才會起作用
- 複合索引,左側的欄位固定時,在索引匹配時,右側的索引才有效。因為複合索引關鍵字排序,按照左邊欄位進行排序,如果左邊欄位相同,才依據右邊欄位。
3.索引建立的優缺點:
優點:
- 建立索引可以大大提高系統的效能
- 通過唯一性索引,可以保證資料庫表中每一行資料的唯一性
- 大大加快檢索速度
- 加速表與表之間的連線
- 使用分組和排序子句進行資料檢索時,減少查詢中分組和排序的時間
- 通過使用索引,可以在查詢過程中,使用優化隱藏器,提高系統性能
缺點:
- 建立索引和維護索引要耗費時間,隨資料量的增加而增加
- 索引佔用物理空間
- 對錶中的資料進行增刪改的時候,索引需動態維護,降低了資料的維護速度
4. 請描述一下mysql主從伺服器之間是如何同步資料的,什麼樣的sql會造成主從無法正確同步?
- 網路的延遲
由於mysql主從複製是基於binlog的一種非同步複製,通過網路傳送binlog檔案,理所當然網路延遲是主從不同步的絕大多數的原因,特別是跨機房的資料同步出現這種機率非常的大,所以做讀寫分離,注意從業務層進行前期設計。
- 主從兩臺機器的負載不一致
由於mysql主從複製是主資料庫上面啟動1個io執行緒,而從上面啟動1個sql執行緒和1個io執行緒,當中任何一臺機器的負載很高,忙不過來,導致其中的任何一個執行緒出現資源不足,都將出現主從不一致的情況。
- max_allowed_packet設定不一致
主資料庫上面設定的max_allowed_packet比從資料庫大,當一個大的sql語句,能在主資料庫上面執行完畢,從資料庫上面設定過小,無法執行,導致的主從不一致。
- key自增鍵開始的鍵值跟自增步長設定不一致引起的主從不一致。
- mysql異常宕機情況下,如果未設定sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出現binlog或者relaylog檔案出現損壞,導致主從不一致。
- mysql本身的bug引起的主從不同步。
- 版本不一致,特別是高版本是主,低版本為從的情況下,主資料庫上面支援的功能,從資料庫上面不支援該功能
5.有一個order表,如下,求購買次數最多的兩個使用者
order_id | user_id | goods |
---|---|---|
100000 | 100 | 蘋果 |
100001 | 100 | 蘋果 |
100002 | 101 | 橘子 |
100003 | 102 | 蘋果 |
100004 | 102 | 香蕉 |
sql:
SELECT order_id,user_id,COUNT(order_id) AS count FROM order GROUP BY user_id ORDER BY count DESC limit 2
Linux
- 如何發現web服務慢
- top:檢視系統性能
- Nginx:最後一個欄位加入
$request_time
列出php頁面請求時間超過3秒的頁面,並統計其出現的次數,顯示前100條cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
- 程式碼中實現,開頭寫入時間,結尾寫入時間
綜合
1. AES和RSA的區別:
- RSA是非對稱加密,公鑰加密,私鑰解密, 反之亦然。缺點:執行速度慢,不易於硬體實現。常私鑰長度有512bit,1024bit,2048bit,4096bit,長度越長,越安全,但是生成金鑰越慢,加解密也越耗時。
- AES對稱加密,金鑰最長只有256個bit,執行速度快,易於硬體實現。由於是對稱加密,金鑰需要在傳輸前通訊雙方獲知。
- AES加密資料塊分組長度必須為128位元,金鑰長度可以是128位元、192位元、256位元中的任意一個(如果資料塊及金鑰 長度不足時,會補齊)
總結:採用非對稱加密演算法管理對稱演算法的金鑰,然後用對稱加密演算法加密資料,這樣我們就集成了兩類加密演算法的優點,既實現了加密速度快的優點,又實現了安全方便管理金鑰的優點。
RBAC:基於角色的訪問控制
- 一個使用者屬於多個角色
- 角色擁有多個動作的許可權
- 使用者是否具有某些動作的許可權
表:使用者表、角色表、動作表,使用者角色關聯表、角色動作關聯表
MongoDB
MongoDB資料型別:
- String(字串): mongodb中的字串是UTF-8有效的。
- Integer(整數): 儲存數值。整數可以是32位或64位,具體取決於您的伺服器。
* Boolean(布林): 儲存布林(true/false)值。
- Double(雙精度): 儲存浮點值。
- Min/ Max keys(最小/最大鍵): 將值與最低和最高BSON元素進行比較。
- Arrays(陣列): 將陣列或列表或多個值儲存到一個鍵中。
- Timestamp(時間戳): 儲存時間戳。
- Object(物件): 嵌入式文件。
- Null (空值): 儲存Null值。
- Symbol(符號): 與字串相同,用於具有特定符號型別的語言。
- Date(日期): 以UNIX時間格式儲存當前日期或時間。
- Object ID(物件ID) : 儲存文件ID。
- Binary data(二進位制資料): 儲存二進位制資料。
- Code(程式碼): 將JavaScript程式碼儲存到文件中。
- Regular expression(正則表示式): 儲存正則表示式
演算法
1. 排序演算法
* 快速排序
快速排序是十分常用的高效率的演算法,其思想是:我先選一個標尺,用它把整個佇列過一遍篩選,以保證其左邊的元素都不大於它,其右邊的元素都不小與它
function quickSort($arr){
// 獲取陣列長度
$length = count($arr);
// 判斷長度是否需要繼續二分比較
if($length <= 1){
return $arr;
}
// 定義基準元素
$base = $arr[0];
// 定義兩個空陣列,用於存放和基準元素的比較後的結果
$left = [];
$right = [];
// 遍歷陣列
for ($i=1; $i < $length; $i++) {
// 和基準元素作比較
if ($arr[$i] > $base) {
$right[] = $arr[$i];
}else {
$left[] = $arr[$i];
}
}
// 然後遞迴分別處理left和right
$left = quickSort($left);
$right = quickSort($right);
// 合併
return array_merge($left,[$base],$right);
}
- 氣泡排序
思路:法如其名,就像冒泡一樣,每次從陣列中冒出一個最大的數
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){
// 獲取陣列長度
$length = count($arr);
// 第一層迴圈控制冒泡輪次
for ($i=0; $i < $length-1; $i++) {
// 內層迴圈控制從第0個鍵值和後一個鍵值比較,每次冒出一個最大的數
for ($k=0; $k < $length-$i; $k++) {
if($arr[$k] > $arr[$k+1]){
$tmp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
- 選擇排序
思路:每次選擇一個相應的元素,然後將其放到指定的位置
function selectSort($arr){
// 實現思路
// 雙重迴圈完成,外層控制輪數,當前的最小值,內層控制比較次數
// 獲取長度
$length = count($arr);
for ($i=0; $i < $length - 1; $i++) {
// 假設最小值的位置
$p = $i;
// 使用假設的最小值和其他值比較,找到當前的最小值
for ($j=$i+1; $j < $length; $j++) {
// $arr[$p] 是已知的當前最小值
// 判斷當前迴圈值和已知最小值的比較,當發下更小的值時記錄下鍵,並進行下一次比較
if ($arr[$p] > $arr[$j]) {
$p = $j; // 比假設的值更小
}
}
// 通過內部for迴圈找到了當前最小值的key,並儲存在$p中
// 判斷 日光當前$p 中的鍵和假設的最小值的鍵不一致增將其互換
if ($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
// 返回最終結果
return $arr;
}