PHP面試知識梳理

關於做者

昨天在思否上發了這篇整理,晚上10點多看到了不少贊收藏和關注,其實挺愧疚的,由於最近在找工做這篇文章並無整理完。看到這個還挺受歡迎的,也由於新工做基本定下來了,如今的公司正常交接中,打算下週末以前把這個知識梳理整理完,感謝各位的點贊、收藏和關注,你們一塊兒努力。javascript

另外,我本身的博客網站在這,哈哈:https://www.linganmin.cnphp

算法與數據結構

BTree和B+tree

  • BTree
    B樹是爲了磁盤或者其餘存儲設備而設計的一種多叉平衡查找樹,相對於二叉樹,B樹的每一個內節點有多個分支,即多叉。

    參考文章:https://www.jianshu.com/p/da5...html

  • B+Tree
    B+樹是B樹的變體,也是一種多路搜索樹。

    參考文章:https://www.jianshu.com/p/da5...前端

排序算法

  • 快速排序
    快速排序是十分經常使用的高效率的算法,其思想是:先選一個標尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大於它,其右邊的元素都不小與它java

    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,4mysql

    function bubbleSort($arr){
    
      // 獲取數組長度
      $length = count($arr);
    
      // 第一層循環控制冒泡輪次
      for ($i=0; $i < $length-1; $i++) { 
        
        // 內層循環控制從第0個鍵值和後一個鍵值比較,每次冒出一個最大的數
        for ($k=0; $k < $length-$i-1; $k++) { 
          if($arr[$k] > $arr[$k+1]){
            $tmp = $arr[$k+1];
            $arr[$k+1] = $arr[$k];
            $arr[$k] = $tmp;
          }
        }
      }
    
      return $arr;
    }
  • 選擇排序
    思路:每次選擇一個相應的元素,而後將其放到指定的位置git

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

計算機網絡

TCP/UDP區別

  • TCP
    TCP是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議
    TCP面向鏈接,提供可靠地數據服務
    TCP首部開銷20字節
    TCP邏輯通訊信道是全雙工的可靠信道
    TCP鏈接只能是點到點的
  • UDP
    UDP是參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠的信息傳遞服務
    UDP無鏈接,不可靠
    UDP首部開銷8字節
    UDP邏輯通訊信道是不可靠信道
    UDP沒有擁塞機制,所以網絡出現擁堵不會使源主機的發送效率下降
    UDP支持一對一,多對一,多對多的交互通訊

三次握手,四次揮手,爲何是三次握手四次揮手

在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接,完成三次握手,客戶端與服務器開始傳送數據。
簡單點說:A與B創建TCP鏈接時,首先A向B發送SYN(同步請求),而後B回覆SYN+ACK(同步請求應答),最後A回覆ACK確認,這樣TCP的一次鏈接(三次握手)就完成了。github

  • TCP三次握手web

    所謂三次握手,是指簡歷一個TCP鏈接時須要客戶端和服務器總共發送三個包
    三次握手的目的是鏈接服務器指定端口,簡歷TCP鏈接,並同步鏈接雙方的序列號並交換TCP窗口大小信息。
    TCP三次握手圖解:
    1. 第一次握手
      客戶端發送一個TCP的SYN標誌位置1的包,指明客戶打算鏈接的服務器的端口,以及初始化序號,保存在包頭的序列號字段裏
    2. 第二次握手
      服務器發揮確認包應答,即SYN標誌位和ACK標誌均爲1,同時將確認序號設置爲客戶的ISN加1,即X+1
    3. 第三次握手
      客戶端再次發送確認包,SYN標識爲0,ACK標識爲1,而且把服務器發來的序號字段+1,放在肯定字段中發送給對方,而且在數據字段寫入ISN的+1

簡單解釋TCP三次握手:
參考:https://github.com/jawil/blog...面試

  • 四次揮手

    TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手。客戶端或服務器都可主動發起揮手動做。
    因爲TCP鏈接時全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成他的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
  • 爲何是三次握手四次揮手
    這是由於服務端的LISTEN狀態下的socket當收到SKY報文的簡歷鏈接的請求後,它能夠把ACK和SYN放在一個報文裏來發送。但關閉鏈接時,當收到對方的FIN報文通知時,他僅僅表示對方沒有數據發送給你了,但未必你的全部數據都所有發送給對方了,因此你能夠不是立刻回關閉socket,即你可能還會發送一些數據給對方以後,在發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此這裏的ACK和FIN報文多狀況下都是分開發送的。

長鏈接和短鏈接

TCP在真正的讀寫操做以前,server和client之間必須創建一個鏈接,當讀寫操做完成後,雙方再也不須要這個連接時他們可能釋放這個鏈接,鏈接的創建是經過三次握手,釋放則須要四次揮手,因此說每一個鏈接的創建都是須要消耗資源和時間的。

  • TCP短鏈接

    1. client向server發起鏈接請求
    2. server接到請求,雙方創建鏈接
    3. client向server發消息
    4. server迴應client
    5. 一次讀寫完成,此時雙方任何一個均可以發起close操做
      通常都是client先發起close操做,由於通常的server不會回覆完client就當即關閉鏈接

因此短鏈接通常只會在client和server間傳遞一次讀寫操做,短鏈接管理起來比較簡單,存在的鏈接都是有用的鏈接,不須要額外的控制手段

  • 長鏈接

    1. client向server發起鏈接
    2. server接到請求後,雙方創建鏈接
    3. client向server發送消息
    4. server迴應client
    5. 一次讀寫完成,鏈接不關閉
    6. 後續讀寫操做
  • 長/短鏈接的操做過程

    1. 短鏈接的操做步驟:
      創建鏈接 -> 數據傳輸 -> 關閉鏈接
    2. 長鏈接的操做步驟:
      創建鏈接 -> 數據傳輸 -> (保持鏈接) -> 數據傳輸 -> 關閉鏈接
  • 長/短鏈接的優缺點

    1. 長鏈接能夠省去較多的TCP創建和關閉操做,減小資源浪費,節省時間,對於比較頻繁的請求資源的客戶端比較適用於長鏈接
    2. 短鏈接對於服務器來講管理較爲簡單,存在的鏈接都是有用的鏈接,不須要額外的控制手段

從瀏覽器輸入域名到展現頁面都發生了什麼

  • DNS域名解析
    先找本地hosts文件,檢查對應域名ip的關係,有則想ip地址發送請求,沒有再去找DNS服務器
  • 創建TCP鏈接
    拿到服務器IP後,向服務器發送求求,三次握手,創建TCP鏈接
    簡單理解三次握手:
    客戶端:您好,在家不,有你快遞
    服務端:在的,送來吧
    客戶端:好滴,來了
  • 發送HTTP請求
    與服務器創建鏈接後,就能夠向服務器發起請求了。具體請求內容能夠在瀏覽器中查看
  • 服務器處理請求
    服務器收到請求後由web服務器(Apache,Nginx)處理請求,web服務器解析用戶請求,知道了須要調用那些資源文件,再經過相應的這些資源文件處理用戶請求和參數,並調用數據庫等,而後將結果經過web服務器返回給瀏覽器
  • 返回響應結果
    在響應結果中都會有一個HTTP狀態碼,諸如咱們熟知的200、40四、500等
    狀態碼都是由三位數字和緣由短語組成,大體爲五類:
    1XX 信息性狀態碼 接收的請求正在處理
    2XX 成功狀態碼 請求正常處理完畢
    3XX 重定向狀態碼 須要附加操做以完成請求
    4XX 客戶端錯誤狀態碼 服務器也沒法處理的請求
    5XX 服務器錯誤狀態碼 服務器請求處理出錯
  • 關閉TCP鏈接
    爲了不服務器與客戶端雙方資源佔用和消耗,當雙方沒有請求或者響應傳遞時,任意一方均可以發起關閉請求,與建立TCP鏈接的三次握手相似,關閉TCP鏈接須要4次揮手
    簡單比喻爲:
    客戶端:哥們,我這邊沒有數據要傳了,我們關閉鏈接吧
    服務端:好的,我看看我這邊還有數據不
    服務端:兄弟,我這邊也沒數據要傳給你了,我們能夠關閉鏈接了
    客戶端:好嘞
  • 瀏覽器解析HTML
  • 瀏覽器佈局渲染

設計模式

設計模式是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

單例模式

當須要保證對象只有一個實例的時候,單例模式是很是有用的。他把建立對象的控制權交給一個單一的點上,任什麼時候候應用程序都只會存在且僅存在一個實例。單例類不該該能在類的外部進行實例化。
一個單例類應該具有如下幾個因素:

  • 必須擁有一個訪問級別爲private的構造函數,用於阻止類被隨意實例化
  • 必須擁有一個保存類的實例的靜態變量
  • 必須擁有一個訪問這個實例的公共靜態方法,該方法一般被命名爲getInstance()
  • 必須擁有一個私有的空的clone方法,防止實例被克隆複製

簡單實例:

class Single
{
    public static $_instance;

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    public static function getInstance()
    {
        if (!self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function sayHi()
    {
        echo "Hi \n";
    }
}

$single = Single::getInstance();
$single->sayHi();

工廠模式

工廠模式解決的是如何不經過new創建實例對象的方法

工廠模式是一種類,它具備爲你建立對象的某些方法,你可使用工廠類建立對象而不使用 new。這樣,若是你想要更改所建立的對象類型只須要更改工廠便可,使用該工廠的全部代碼會自動更改。

工廠模式每每配合接口一塊兒使用,這樣應用程序就沒必要要知道這些被實例化的類的具體細節,只要知道工廠返回的是支持某個接口的類就能夠方便的使用了。

簡單舉例:

/**
 * 抽象出一我的的接口
 * Interface Person
 */
interface Person
{
    public function showInfo();
}

/**
 * 一個繼承於抽象人接口的學生類
 * Class Student
 */
class Student implements Person
{
    public function showInfo()
    {
        echo "這是一個學生 \n";
    }
}

/**
 * 一個繼承於抽象人接口的老師類
 * Class Teacher
 */
class Teacher implements Person
{
    public function showInfo()
    {
        echo "這是一個老師 \n";
    }
}

/**
 * 人類工廠
 * Class PersonFactory
 */
class PersonFactory
{
    public static function factory($person_type)
    {
        // 將傳入的類型首字母大寫
        $class_name = ucfirst($person_type);

        if(class_exists($class_name)){
            return new $class_name;
        }else{
            throw  new Exception("類:$class_name 不存在",1);
        }
    }
}

// 須要一個學生
$student = PersonFactory::factory('student');
echo $student->showInfo();

// 須要一個老師的時候
$teacher = PersonFactory::factory('teacher');
echo $teacher->showInfo();

緩存相關

Redis和Memcached的區別

  • Redis和Memcache都是將數據存放在內存中,都是內存數據庫。可是Memcache還能夠緩存其餘東西,好比圖片、視頻
  • Redis不僅支持簡單的k/v類型的數據,同時還提供list、set、hash等數據結構的存儲
  • 虛擬內存,當物理內存用完時Redis能夠將一些好久沒有用到的value交換到磁盤
  • 過時策略,memcache在set時就指定,例如set key1 0 0 8即永不過時,redis能夠經過expire設定,例如:expire name 10
  • 分佈式,設定memcache集羣,利用magent作一主多從;redis也能夠作一主多從。
  • 存儲安全,memcache掛掉後,數據沒了;redis能夠按期保存在磁盤(持久化)
  • 災難恢復,memcache掛掉後數據不可恢復;redis數據丟失後能夠經過aof恢復
  • redis支持數據的備份,即master-slave模式的數據備份
  • 應用場景不一樣:redis除了能夠作nosql數據庫以外,還能作消息隊列、數據堆棧和數據緩存等。memcache適合於緩存sql語句、數據集、用戶臨時性數據、延遲查詢數據和session等

redis有哪些數據結構

  • String
    字符串類型是redis最基礎的數據結構,首先鍵是字符串類型,並且其餘幾種結構都是在字符串類型基礎上構建的
    字符串類型實際上能夠是字符串、數字、二進制(圖片、音頻),單最大不能超過512M
    使用場景:

    1. 緩存
      字符串最經典的使用場景,redis做爲緩存層,mysql做爲存儲層,絕大部分請求數據都是redis中獲取,因爲redis具備支撐高併發特性,因此緩存一般能起到加速讀寫和下降後端壓力的做用
    2. 計數器
      許多應用都會使用redis做爲技術的基礎工具,它能夠實現快速技術、查詢緩存的功能。
    3. 共享session
      處於負載均衡的考慮,分佈式服務會將用戶信息的訪問均衡到不一樣服務器,用戶刷新一次訪問可訥訥個會須要從新登陸,爲了不這個問題可使用redis將用戶session集中管理,在這種模式下只要保證redis的高可用和擴展性,每次獲取用戶更新或查詢登陸信息都直接從redis中集中獲取
    4. 限速
      出於安全考慮,每次進行登陸時讓用戶輸入手機驗證碼,爲了短信接口不被頻繁訪問,會限制用戶每分鐘獲取驗證碼的頻率
  • Hash
    在redis中哈希類型是指鍵自己又是一種鍵值對結構,如 value = {{field1,value1}...{fieldn,valuen}}
    使用場景:

    1. 哈希結構相對於字符串序列化緩存信息更加直觀,而且在更新操做上更加便捷。
  • list
    列表類型是用來存儲多個有序的字符串,列表的每一個字符串成爲一個元素,一個列表最多能夠存儲2的32次方減1個元素。在redis中,能夠對列表插入(push)和彈出(pop),還能夠獲取指定範圍的元素列表。列表是一種比較靈活的數據結構,它能夠充當棧和隊列的角色。
    使用場景:

    1. 消息隊列
      redis的lpush+brpop命令組合就能夠實現阻塞隊列,生產者客戶端是用lpush從列表左側插入元素,多個消費者客戶端使用brpop命令阻塞式的搶列表尾部的元素,多個客戶端保證了消費的負載均衡的高可用性。
    2. 使用技巧列表

      lpush+lpop=Stack(棧)
      lpush+rpop=Queue(隊列)
      lpush+ltrim=Capped Collection(有限集合)
      lpush+brpop=Message Queue(消息隊列)
  • set
  • sortedset

redis是單線程的麼,爲何

由於CPU並非Redis的瓶頸,Redis的瓶頸最有多是機器內存或者網絡帶寬。既然單線程容易實現,並且CPU不會成爲瓶頸,那麼久瓜熟蒂落的採用了單線程的方案。

固然單個Redis進程是沒辦法使用多核的 ,可是它來就不是很是計算密集型的服務。若是單核性能不夠用,能夠多開幾個進程。

redis的部署方式,主從、集羣

參考文章:https://segmentfault.com/a/11...

redis的哨兵模式

參考文章:https://www.cnblogs.com/xifen...

redis的持久化策略

  • RDB(快照持久化)
  • AOF(只追加文件持久化)

參考文章:https://segmentfault.com/a/11...

隊列和棧的區別

  • 什麼是隊列?什麼是棧?

    1. 隊列(Queue):是限定只能在表的一端進行插入和在另外一端刪除操做的線性表。
    2. 棧(Stack):是限定之能在表的一端進行插入和刪除操做的線性表。
  • 隊列和棧的規則

    1. 隊列:先進先出
    2. 棧:先進後出
  • 隊列和棧的遍歷數據速度

    1. 隊列:基於地址指針進行遍歷,並且能夠從頭部或者尾部進行遍歷,但不能同時遍歷,無需開闢空間,由於在遍歷的過程當中不影響數據結構,因此遍歷速度要快。
    2. 棧:只能從頂部取數據,也就是說最早進入棧底的,須要遍歷整個棧才能取出來,並且在遍歷數據的同事須要微數據開闢臨時空間,保持數據在遍歷前的一致性。

PHP基礎

  1. 雙引號單引號區別

    • 雙引號解釋變量,單引號不解釋變量
    • 雙引號裏插入單引號,其中單引號裏若是有變量的話,變量解釋
    • 雙引號的變量名後面必需要有一個非數字、字母、下劃線的特殊字符,或者用{}講變量括起來,不然會將變量名後面的部分當作一個總體,引發語法錯誤
    • 能使單引號字符儘可能使用單引號,單引號的效率比雙引號要高
  2. GET和POST提交方式的區別

    • GET產生一個TCP數據包;POST產生兩個TCP數據包;
      對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據)
      對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
    • GET在瀏覽器回退時是無害的,而POST會再次提交請求
    • GET請求會被瀏覽器主動cache,而POST不會,除非手動設置
    • GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留
    • GET請求只能進行url編碼,而POST支持多種編碼方式
    • GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息
  3. 如何獲取客戶端的真實ip
    $_SERVER['REMOTE_ADDR']或getenv('REMOTE_ADDR')
    可使用ip2long()轉成數字
  4. include和require的區別
    require是無條件包含,也就是若是一個流程里加入require,不管條件成立與否都會先執行require,當文件不存在或者沒法打開的時候,會提示錯誤,而且會終止程序執行
    include有返回值,而require沒有(可能由於如此require的速度比include快),若是被包含的文件不存在的化,那麼會提示一個錯誤,可是程序會繼續執行下去

    注意:包含文件不存在或者語法錯誤的時候require是致命的,而include不是

  5. AJAX的優點是什麼
    ajax是異步傳輸技術,能夠經過javascript實現,也能夠經過JQuery框架實現,實現局部刷新,減輕了服務器的壓力,也提升了用戶體驗
  6. 在程序的開發中,如何提升程序的運行效率

    • 優化SQL語句,查詢語句中儘可能不使用select *,用哪一個字段查哪一個字段;
    • 少用子查詢可用錶鏈接代替;
    • 少用模糊查詢;
    • 數據表中建立索引;
    • 對程序中常常用到的數據生成緩存;
  7. SESSION與COOKIE的區別

  8. isset和empty的區別

    • isset()函數 通常用來檢測變量是否設置
      若變量不存在則返回 FALSE
      若變量存在且其值爲NULL,也返回 FALSE
      若變量存在且值不爲NULL,則返回 TURE
    • empty()函數是檢查變量是否爲空
      若變量不存在則返回 TRUE
      若變量存在且其值爲""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 TURE
      若變量存在且值不爲""、0、"0"、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則返回 FALSE
  9. 數據庫三範式

    • 第一範式:1NF是對屬性的原子性約束,要求屬性具備原子性,不可再分解;
    • 第二範式:2NF是對記錄的唯一性約束,要求記錄有唯一標識,即實體的唯一性;
    • 第三範式:3NF是對字段冗餘性的約束,即任何字段不能由其餘字段派生出來,它要求字段沒有冗餘。
  10. 主鍵、外鍵和索引的區別

    • 定義
      主鍵--惟一標識一條記錄,不能有重複的,不容許爲空
      外鍵--表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
      索引--該字段沒有重複值,但能夠有一個空值
    • 做用
      主鍵--用來保證數據完整性
      外鍵--用來和其餘表創建聯繫用的
      索引--是提升查詢排序的速度
    • 個數
      主鍵--主鍵只能有一個
      外鍵--一個表能夠有多個外鍵
      索引--一個表能夠有多個惟一索引
  11. 堆和棧的區別
    棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;
    堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。

PHP包管理器Composer與自動加載規範

composer學習地址:http://docs.phpcomposer.com/0...

composer.json中的自動加載映射

目前PSR-0自動加載、PSR-4自動加載、classmap生成和files引入都是被支持的,PSR-4是首推的方法,由於它提供了更大的易用性。

  • PSR-4
    PSR-4規範瞭如何指定文件路徑從而自動加載類,同時規範了自動加載文件的位置。乍一看這是和PSR-0重複了,實際上,在功能上確實有一部分重複。區別在於,PSR-4的規範比較乾淨,去除了兼容PHP5.3之前版本的內容。
    PSR-4和PSR-0最大的區別是對下劃線的定義不一樣,PSR-4中,在類名中使用下劃線是沒有特殊含義的,而在PSR-0的規則中,下劃線或被轉化爲目錄分隔符

    在PSR-4的鍵下,你能夠定義命名空間和路徑的映射關係,當自動加載類如Foo\\Bar\\Baz時,命名空間Foo指向一個名爲src/的目錄意味着自動加載器將查找名爲src/Bar/Baz.php文件並引用它。

    命名空間的前綴必須以\\結尾,以免相似前綴之間的衝突。在安裝和更新期間,PSR-4引用所有組合到一個key=>value數組中,該數組能夠在生成的文件vendor/composer/autoload_psr4.php中找到。

    例子:

    {
      "autoload": {
        "psr-4": {
          "App\\": "App/" // 命名空間App映射到目錄App
        }
      }
    }
  • classmap
    classmap引用的全部組合,都會在安裝、更新的過程當中生成並存儲到vendor/composer/autoload_classmap.php文件中。
    你可使用classmap生成支持自定義加載的不遵循PSR-4規範的類庫,要配置它指向的目錄,以便可以準確的搜索到類文件

    例子:

    {
      "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
      }
    }
  • Files
    若是你想要明確指定,在每次請求時都要載入某些文件,那麼你可使用files字段加載。一般做爲函數庫的載入方式。

    例子:

    {
      "autoload": {
        "files": ["src/MyLibrary/functions"]
      }
    }

PHP框架

Laravel相關

Laravel是一套簡潔、優雅的PHP Web開發框架(PHP Web Framework)。它可讓你從麪條同樣雜亂的代碼中解脫出來;它能夠幫你構建一個完美的網絡APP,並且每行代碼均可以簡潔、富於表達力。

由於Laravel對底層的封裝很深,因此你可能須要先去了解什麼是依賴注入,什麼是Laravel的服務容器,關於這兩點我整理了下面兩個連接,一個是(Symfony框架做者)寫的什麼是依賴注入,一個是深刻研究Laravel的依賴注入容器(是我翻譯的國外一大神的)

  1. 什麼是依賴注入
  2. 譯文深刻研究Laravel的依賴注入容器

前端相關

參考複習資料

JavaScript

值傳遞 VS 引用傳遞

參考文章: 數值類型vs引用類型

JavaScript有5種經過複製數值傳值的數據類型:BooleannullundefindStringNumber,稱之爲基本數據類型
JavaScript還有三種經過引用傳值的數據類型:ArrayFunctionObject,他們統稱爲Objects,故而稱爲對象。

  • 基本數據類型
    若是爲一個基本數據類型變量賦值,咱們能夠認爲變量包含這個原始值

    var x = 100;
    var y = 'abx';
    var z = null;
    var is_login = false;

    當咱們使用=將這些變量賦值給其餘變量時,咱們把這些值拷貝給了這些新變量,他們是經過值複製的,也就是說在內存中會同時存在兩個值相同的變量,並指向不一樣的內存空間:

    var x = 100;
    var name = 'saboran';
    
    var a = x;
    var b = name;

    值傳遞的好處是:當改變其中一個變量的值時並不會影響另外一個變量的值。

  • 對象
    非基本數據類型的變量會保存對值(地址)的引用。該引用指向內存中對象的地址,變量實際不包含該實際值。對象建立於計算機內存中,當咱們寫下代碼var arr = [],咱們其實是在內存中建立了一個新數組,arr中如今包含了新數組在內存中的地址。

    • 引用賦值
      當一個對象被用=賦值給另外一個變量,其實是複製過去的是那個對象在內存中的地址。對象經過引用賦值而不是直接傳值,對象自己是靜態不變的、惟一改變的是對象的引用地址。

做用域

參考文章:理解 JavaScript 做用域

聲明提高

參考文章:JavaScript 變量聲明提高

閉包

參考文檔:JavaScript閉包

this

參考文章:javascript中的this做用域詳解

apply、call、bind

參考文章:javascript中call()、apply()、bind()的用法終於理解

參考文章:獨家解析Javascript原型繼承

教程

廖雪峯的JavaScript全棧教程

參考文章

VueJS

  • VueJs雙向數據綁定原理

Linux

Cors跨域

CORS的基本原理是經過設置HTTP請求和返回中header,告知瀏覽器該請求是合法的。這涉及到服務器端和瀏覽器端雙方的設置:請求的發起(Http Request Header)和服務器對請求正確的響應(Http response header)。

參考文章:https://zhuanlan.zhihu.com/p/...

相關文章
相關標籤/搜索