天天看點

PHP面試知識梳理(建議收藏)

算法與資料結構

BTree和B+tree

  • BTree B樹是為了磁盤或者其他儲存設備而設計的一種多叉平衡查找樹,相對于二叉樹,B樹的每個内節點有多個分支,即多叉。參考文章:https://www.jianshu.com/p/da5…
  • B+Tree B+樹是B樹的變體,也是一種多路搜尋樹。參考文章:https://www.jianshu.com/p/da5…

排序算法

  • 快速排序 快速排序是十分常用的高效率的算法,其思想是:先選一個标尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大于它,其右邊的元素都不小與它
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);
  
}
           

工作十二年準備的PHP進階架構資料,如果你覺得有用,俺分享給大家:

【1000粉絲福利】12年架構師分享PHP進階架構資料,助力大家都能30K

點選進人暗号:知乎

  • 冒泡排序 思路:法如其名,就像冒泡一樣,每次從數組中冒出一個最大的數 比如: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-1; $k++) { 
      if($arr[$k] > $arr[$k+1]){
        $tmp = $arr[$k+1];
        $arr[$k+1] = $arr[$k];
        $arr[$k] = $tmp;
      }
    }
  }

  return $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的一次連接配接(三次握手)就完成了。

  • TCP三向交握 所謂三次握手,是指履歷一個TCP連接配接時需要用戶端和伺服器總共發送三個包 三次握手的目的是連接配接伺服器指定端口,履歷TCP連接配接,并同步連接配接雙方的序列号并交換TCP視窗大小資訊。 TCP三向交握圖解:
PHP面試知識梳理(建議收藏)
  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、404、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. 雙引号單引号差別
  • 雙引号解釋變量,單引号不解釋變量
  • 雙引号裡插入單引号,其中單引号裡如果有變量的話,變量解釋
  • 雙引号的變量名後面必須要有一個非數字、字母、下劃線的特殊字元,或者用{}講變量括起來,否則會将變量名後面的部分當做一個整體,引起文法錯誤
  • 能使單引号字元盡量使用單引号,單引号的效率比雙引号要高
  1. 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上,是以不能用來傳遞敏感資訊
  1. 如何擷取用戶端的真實ip $_SERVER[‘REMOTE_ADDR’]或getenv(‘REMOTE_ADDR’) 可以使用ip2long()轉成數字
  2. include和require的差別 require是無條件包含,也就是如果一個流程裡加入require,無論條件成立與否都會先執行require,當檔案不存在或者無法打開的時候,會提示錯誤,并且會終止程式執行 include有傳回值,而require沒有(可能因為如此require的速度比include快),如果被包含的檔案不存在的化,那麼會提示一個錯誤,但是程式會繼續執行下去注意:包含檔案不存在或者文法錯誤的時候require是緻命的,而include不是
  3. AJAX的優勢是什麼 ajax是異步傳輸技術,可以通過javascript實作,也可以通過JQuery架構實作,實作局部重新整理,減輕了伺服器的壓力,也提高了使用者體驗
  4. 在程式的開發中,如何提高程式的運作效率
  • 優化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;
  • 少用子查詢可用表連接配接代替;
  • 少用模糊查詢;
  • 資料表中建立索引;
  • 對程式中經常用到的資料生成緩存;
  1. SESSION與COOKIE的差別
  • 存儲位置:session存儲在伺服器,cookie存儲在浏覽器
  • 安全性:session安全性高于cookie 參考連結:https://www.zhihu.com/questio…
  1. 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
  1. 資料庫三範式
  • 第一範式:1NF是對屬性的原子性限制,要求屬性具有原子性,不可再分解;
  • 第二範式:2NF是對記錄的惟一性限制,要求記錄有惟一辨別,即實體的惟一性;
  • 第三範式:3NF是對字段備援性的限制,即任何字段不能由其他字段派生出來,它要求字段沒有備援。
  1. 主鍵、外鍵和索引的差別
  • 定義 主鍵–唯一辨別一條記錄,不能有重複的,不允許為空 外鍵–表的外鍵是另一表的主鍵, 外鍵可以有重複的, 可以是空值 索引–該字段沒有重複值,但可以有一個空值
  • 作用 主鍵–用來保證資料完整性 外鍵–用來和其他表建立聯系用的 索引–是提高查詢排序的速度
  • 個數 主鍵–主鍵隻能有一個 外鍵–一個表可以有多個外鍵 索引–一個表可以有多個唯一索引
  1. 堆和棧的差別 棧是編譯期間就配置設定好的記憶體空間,是以你的代碼中必須就棧的大小有明确的定義; 堆是程式運作期間動态配置設定的記憶體空間,你可以根據程式的運作情況确定要配置設定的堆記憶體的大小。

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的依賴注入容器

最全大廠面試題希望能幫助到到家

PHP面試題彙總,看完這些面試題助力你面試成功,工資必有20-25K

以上内容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家,需要的可以點選進入暗号:知乎。

喜歡我的文章就關注我吧,持續更新中…

喜歡我的文章就點贊關注吧

繼續閱讀