忽然之间的博客

Thoughts, stories and ideas.

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 - 加载命名空间

参考