zoukankan      html  css  js  c++  java
  • composer设计原理与基本用法

    原文地址:http://blog.turn.tw/?p=1039

    COMPOSER進階原理:PHP命名空間與PSR-0   http://blog.turn.tw/?p=1122

    Moving PHP forward through collaboration and standards.

    PHP的PSR代码规范   https://www.php-fig.org/psr/

    PHP大本营     https://www.php-fig.org/

    packagist    https://packagist.org/

    phpunit中文网   http://www.phpunit.cn/

    composer中文网   https://www.phpcomposer.com/

    飞鸿影童鞋的composer教程   https://www.cnblogs.com/52fhy/p/5246013.html

     hacknews https://news.ycombinator.com/item?id=9637685

    非常不错的文章  https://www.inside.com.tw/2016/02/19/javascript-novice-advice-and-learning-resources

    相信有在用PHP的朋友近年來常聽到composer這個套件管理工具。
    它到底是做什麼用的?又是為了解決什麼問題而存在呢?
    要瞭解這個,得先從歷史開始說起…。

    PHP最早讀取套件的方法

    初學PHP時,最早會面對的問題之一就是require與include差別何在?
    require_once與include_once又是什麼?
    弄懂這些問題之後,如果不使用framework,直接開發,便常出現類似這樣的code:

    這樣的結果,會產生至少兩個問題:
    1. 許多檔案用到同樣幾個class,於是在不同地方都需要載入一次。
    2. 當類別多了起來,會顯得很亂、忘記載入時還會出現error。

    那麼,不如試試一種懶惰的作法?
    寫一個php,負責載入所有類別: 

    然後在其他檔案都載入這支檔案即可: 

    結果新問題又來了:當類別很多的時候,隨便一個web page都會載入一堆code,吃爆記憶體,怎麼辦呢?

    __autoload

    為了解決這個問題,PHP 5開始提供__autoload這種俗稱「magic method」的函式。
    當你要使用的類別PHP找不到時,它會將類別名稱當成字串丟進這個函式,在PHP噴error投降之前,做最後的嘗試: 

    也因為PHP這種「投降前最後一次嘗試」的行為,有時會讓沒注意到的人困惑「奇怪我的code怎麼跑得動?我根本沒有require啊..」,所以被稱為「magic method」。
    如此一來,問題似乎解決了?
    可惜還是有小缺點..,就是這個__autoload函式內容會變得很巨大。以上面的例子來說,一下會去根目錄找、一下會去other_library資料夾、一下會去my_library資料夾尋找。在整理檔案的時候,顯得有些混亂。

    spl_autoload_register

    於是PHP從5.1.2開始,多提供了一個函式。
    可以多寫幾個autoload函式,然後註冊起來,效果跟直接使用__autoload相同。
    現在可以針對不同用途的類別,分批autoload了。 

    每個loader內容可以做很多變化。可以多寫判斷式讓它更智慧、可以進行字串處理…。
    自動載入類別的問題終於解決了…。

    但是光上面的code也有15行,而且在每個project一定都會寫類似的東西。有沒有辦法自動產生這15行呢?
    我的願望很簡單,我告訴你,反正我有my_library資料夾跟other_library資料夾,你自己進去看到什麼類別就全部載入好不好…?
    阿不對,全部載入剛又說效能不好,那你進去看到什麼就全部想辦法用spl_autoload_register記起來好不好…?
    我懶得打15行了,我只想打這幾個字:

    可不可以發明一個工具,去吃$please_autoload這個變數,然後自己想辦法載入一切啊…?

    ㄟ等等,我連php程式碼都懶得打了,在web領域JSON格式更簡潔。允許我這樣打,好嗎?

    然後誰來個工具幫我產生一大串autoload相關的php程式碼吧…,可以嗎?

    可以。

    Composer登場

    首先,裝好composer(本文不介紹如何安裝。)
    再來,建立一個composer.json檔,裏面輸入這些: 

    比原本希望的多打了一些字,不過差不多。
    再來,在terminal輸入 

    執行成功之後,你會看到一個vendor資料夾,內含一個autoload.php。
    沒錯,跟你夢想的一樣。你只要載入這個檔案: 

    php再也不會噴error說你「類別尚未定義」了!
    這vendor資料夾裏面的一切,都只是php code而已,並沒有特別神奇的地方。只要去看autoload.php的原始碼,就能知道composer到底寫了哪些php code給你。

    ㄟ等等,我寫的類別都放在my_library裏面了,other_library都是網路上copy下來的現成類別。我想要用Google API的Client類別、Doctrine資料庫管理抽象層類別、還有guzzlehttp的發送request類別。
    我連去下載這些檔案、然後丟進這個資料夾都懶得做了,我根本不想手動建立other_library這個資料夾。composer真那麼神…不如連下載都幫我自動下載?可以嗎?

    可以。

    查詢一下那幾個套件在「https://packagist.org/」的名稱、還有你需要的版本號。
    把剛剛的composer.json改成這樣:

    然後’composer install’指令除了自動載入你的類別之外、還會自動下載你需要的類別、然後自動載入它們。
    一樣require ‘vendor/autoload.php’就可以了。composer實在是太棒了。

    其實composer解決的問題不只這樣。
    類別多了起來之後,各種程式語言都提供namespace功能協助分類。
    在有namespace的情況下,PHP社群與composer是如何解決自動載入的問題呢?
    這些比較進階的內容,下回分曉。

  • 相关阅读:
    leetcode 347. Top K Frequent Elements
    581. Shortest Unsorted Continuous Subarray
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 217. Contains Duplicate、219. Contains Duplicate II、220. Contains Duplicate、287. Find the Duplicate Number 、442. Find All Duplicates in an Array 、448. Find All Numbers Disappeared in an Array
    leetcode 461. Hamming Distance
    leetcode 19. Remove Nth Node From End of List
    leetcode 100. Same Tree、101. Symmetric Tree
    leetcode 171. Excel Sheet Column Number
    leetcode 242. Valid Anagram
    leetcode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/macliu/p/9783486.html
Copyright © 2011-2022 走看看