php composer 包管理和class类自动载入有什么联系?越详细越好
回复内容: php composer 包管理和class类自动载入有什么联系?越详细越好
本质而言两者关联不大
自动载入是spl_autoload_register注册的自动载入函数实现(通过重载__autoload函数也可以实现,不过不推荐,这样一来只能有一个autoload函数),你可以自己写这个函数,一般来说需要包括对namespace和class类名的解析,并且把它include进来。所有注册的自动载入函数会在php找不到某个类的时候依次触发。(这里的函数是一个callable对象,包括:类方法(动静皆可),closure闭包(lambda函数),普通函数)
composer通过每个包的composer.json提供的require的配置来管理包之间的依赖,并且同时它提供了一个autoload的实现来加载这些包下面的类
只要你的代码的类的存储路径是按照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自动加载器