composer 自动加载原理

verdor/composer/目录下有四个配置文件:

  • autoload_classmap.php: 要加载的class映射
  • autoload_files.php: 要加载的文件
  • autoload_namespaces.php: psr-0标准
  • psr4.php: psr-4标准

这些配置文件的主要目的是为了定义一个(别名对应路径的数组),使引入的时候可以更加方便

开始:

调用第一个文件        vendor\composer\autoload_real.php          getLoader方法
引入第二个文件   vendor\composer\ClassLoader.php        

getLoader()这个方法会先把这些配置文件放到ClassLoader的私有属性中。

然后通过$loader->register(true);来调用spl_autoload_register()

1
2
3
4
public function register($prepend = false)
{
    spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}

spl_autoload_register()把loadClass()方法注册到了autoload队列中,然后当PHP引擎试图实例化未知类的操作时,就会根据类名和命名空间加载这个类文件。

1
2
3
4
5
6
7
8
public function loadClass($class)
{
    if ($file = $this->findFile($class)) {
        includeFile($file);

        return true;
    }
}

调用了\Composer\Autoload\ClassLoader的 loadClass()->findFile() 。在findFile中,查找顺序是: classmap->psr4->psr0 ,找到的话就返回类文件的路径名。


spl_autoload_register + namespace  自动加载主流。所以用namespace就能找到详细的路径,从而找到类文件。


psr-0 与psr - 4 的不同

  1. PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。
  2. composer的PSR-4带来更简洁的文件结构。
  3. 参考:PSR-4——新鲜出炉的PHP规范

总结: 1. 命名空间前缀对应相应的文件夹 2. 类名和文件名相同,文件后缀为PHP

psr-4

{
    "psr-4" : {
       "Foo\\": "src/"
    },
}

按照PSR-4的规则,当试图自动加载 “Foo\Bar\Baz” 这个class时,会去寻找 “src/Bar/Baz.php” 这个文件,如果它存在则进行加载。

prs-0

{
    "psr-0" : {
       "Foo\\": "src/",
    },
}

PSR-0有此配置,那么会去寻找 “src/Foo/Bar/Baz.php”

PSR-0当试图自动加载 “Foo\A_B” 这个class时,会去寻找 “src/Foo/A/B.php” 这个文件.

参考链接http://www.tuicool.com/articles/mARrMj6

classmap

{
    "autoload": {
            "classmap": [
                "database"
            ],
    }
}

classmap 做的是类名和文件所在位置的映射

写的很好的一个关于composer的文章   https://laravel-china.org/topics/1002

文章来源: http://hanfeng.name/blog/2015/08/17/composer-autoload/

你可能感兴趣的:(php)