首頁  >  文章  >  後端開發  >  php中一些重要的php知識點分享

php中一些重要的php知識點分享

小云云
小云云原創
2018-03-16 16:08:195376瀏覽

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_pa​​cket設定不一致

主資料庫上面設定的max_allowed_pa​​cket比從資料庫大,當一個大的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   

100002    101    橘子   

100003    102    蘋果   

100004  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;
}

相关推荐:

PHP中的运算符及PHP知识基础

关于PHP知识点的详细介绍

对PHP知识的有关介绍介绍

以上是php中一些重要的php知識點分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn