PHP類自動加載

很多開發者寫面向對象的應用程序時對每個類的定義建立一個 PHP 源文件。一個很大的煩惱是不得不在每個腳本開頭寫一個長長的包含文件列表(每個類一個文件)。

PHP 為了解決自動加載,提供了幾種方法。

  • __autoload
  • spl_register_autoload
  • composer

__autoload — 嘗試加載未定義的類

在調用類的時候,如果類沒有定義, 則嘗試在__autoload() 定義中加載
此函數參數為 當前調用的類名。

__autoload() 只可以定義一次。

void __autoload ( string $class )
./myClass.php
<?php
class myClass {
    public function __construct() {
        echo "myClass init'ed successfuly!!!";
    }
}
?>

./index.php
<?php
// we've writen this code where we need
function __autoload($classname) {
    $filename = "./". $classname .".php";
    include_once($filename);
}

// we've called a class ***
$obj = new myClass();
?>


spl_autoload_register — 注冊給定的函數作為 __autoload 的實現

spl_autoload_register() 可以創建多條autoload規則, 按定義的順序逐個執行。

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

使用 Composer

Composer 是 PHP 的一個依賴管理工具。它允許你申明項目所依賴的代碼庫,它會在你的項目中為你安裝他們。

Composer 將這樣為你解決問題:

a) 你有一個項目依賴于若干個庫。

b) 其中一些庫依賴于其他庫。

c) 你聲明你所依賴的東西。

d) Composer 會找出哪個版本的包需要安裝,并安裝它們(將它們下載到你的項目中)。

  • 全局安裝
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
  • 聲明依賴

在項目根目錄創建 composer.json

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}

執行

composer install

或者 直接執行 composer require , 將安裝或更新依賴

composer require "monolog/monolog 1.2.*"
  • 自動加載

當依賴包安裝完成后, 會在/vendor 下生成autoload.php文件
此文件實現了包的自動加載。

require 'vendor/autoload.php';

autoload.php 自動加載的實現

/vendor/composer 目錄下生成如下文件

vendor/composer
        ├── autoload_classmap.php
        ├── autoload_files.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        ├── autoload_real.php
        ├── autoload_static.php
        ├── ClassLoader.php
        ├── installed.json

autoload_real.php 中定義了加載類

查找和加載文件,依次從autoload_namespaces.phpautoload_psr4.php, autoload_classmap.php, autoload_files.php中定義的關系中嘗試加載。

為什么會有autoload_*.php 這4個文件呢,因為這分別對應一種查找規則。詳細說明:

autoload_namespaces.php - 加載命名空間

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在PHP開發過程中,如果希望從外部引入一個class,通常會使用include和require方法,去把定義這...
    四月不見閱讀 1,083評論 0 0
  • 版本 PHP5.1.2 之前使用 __autoload() 。PHP5.1.2 之后使用 spl_autoload...
    新亮筆記閱讀 321評論 0 2
  • Welcome 目前網絡上充斥著大量的陳舊信息,讓PHP新手誤入歧途,傳播著錯誤的實踐和糟糕的代碼,這必須得到糾正...
    layjoy閱讀 21,723評論 7 118
  • 我們探索了 從 1 app/public/index.php 開始 2 加載 bootstrap /autoloa...
    你很鬧i閱讀 1,263評論 0 1
  • 上個周末和大學寢室的室友一起約著回了趟母校。其實早就想回去了,自從09年7月份離開后,就再也沒有回去過。雖...
    因風初苒苒閱讀 277評論 0 0