很多開發者寫面向對象的應用程序時對每個類的定義建立一個 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.php
、autoload_psr4.php
, autoload_classmap.php
, autoload_files.php
中定義的關系中嘗試加載。
為什么會有autoload_*.php 這4個文件呢,因為這分別對應一種查找規則。詳細說明:
autoload_namespaces.php
- 加載命名空間