PHP composer 包管理和class类自动载入有什么联系?越详细越好

PHP composer 包管理和class类自动载入有什么联系?越详细越好

本质而言两者关联不大

  1. 自动载入是spl_autoload_register注册的自动载入函数实现(通过重载__autoload函数也可以实现,不过不推荐,这样一来只能有一个autoload函数),你可以自己写这个函数,一般来说需要包括对namespace和class类名的解析,并且把它include进来。所有注册的自动载入函数会在PHP找不到某个类的时候依次触发。(这里的函数是一个callable对象,包括:类方法(动静皆可),Closure闭包(Lambda函数),普通函数)

  2. composer通过每个包的composer.json提供的require的配置来管理包之间的依赖,并且同时它提供了一个autoload的实现来加载这些包下面的类

  3. 只要你的代码的类的存储路径是按照PSR-4标准推荐和PSR-0标准来规划的,你可以利用composer的autoload来管理你自己的类,这个稍微去翻下composer的文档即可

所以composer是个包管理器,它管理的是包而不是类,不过提供了一个加载这些包内类的autoload实现,但不妨碍你自己实现一个你自己的。

  • spl_autoload_register: http://php.net/manual/zh/function.spl-autoload-register.php

  • PSR-4: http://www.php-fig.org/psr/psr-4/ 汉化: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md

  • PSR-0: http://www.php-fig.org/psr/psr-0/ 汉化: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-0-cn.md

完全两个东西嘛
composer是把你依赖的项目从源安装,举个不是很恰当的例子,Linux系统有很多包都是相互依赖的,当package A以来package B时,B也会安装.
类自动加载是你不大可能只用一个文件或者class就处理完所有业务,比如说MVC架构,不同controller之间可能要相互调用,controllerA.php文件里没有controllerB.php的代码,只能通过类的自动加载实现.将controllerB.php加载进 A 的上下文.
这儿有一篇讲解PHP自动加载机制的可以看看PHP自动加载器

发表评论

电子邮件地址不会被公开。 必填项已用*标注