这种是比较原始的方式了,跟用require其实差不多,只能加载配置好的单独文件。{ "autoload": { "files": ["src/MyLibrary/functions.php"] }}
这种加载方式就有点升级了,可以扫描指定目录下的所有php,ini文件中的class,有点像批量加载。而且这种方式辨识度很高,使用composer执行更新自动加载后,直接能看到引用了多少个文件,在vendor/composer/autoload_classmap.php文件里也能明显看到是否引入了目标文件。 { "autoload": { "classmap": ["src/", "lib/", "Something.php"] }}
到这一步已经快跟上时代了。因为前面说的两种,都是强制加载。不管用得着用不着的类,只要配置在加载列表里就会引入文件,而现在说的呢,只有实例化的类才会触发引入,在指定目录寻找对应的引用文件从而实例化类。 { "autoload": { "psr-0": { "Foo": "src/" } }}
主角终于登场了,这就是今天要说的重点。比起上一种其实区别不大,只有方式名称0和4的区别.加载机制也一样。无非就是新的命名规范简化了目录。这个我是懒得去深究了,只是知道这就是我想要的。{ "autoload": { "psr-4": { "Controller":"app/" } }}
使用方法很简单,不做太详细介绍。前面的几种方法里都有关键代码。把这些关键代码放在项目下的composer.json里,然后在该文件目录下执行命令composer dump-autoload,以及composer install就Ok了。也可以在vendor/composer/下的对应的文件里查看,是否配置成功。
总算说到代码层面了,通过上面的图片我已经标示出了关键的几个文件。其中涉及psr-4加载的是autoload_psr4.php,autoload_static.php。关于static这个文件我先卖个关子,稍候再提及。那么composer到底是怎样实现自动加载呢?小编要开讲了。第一步当然是要引入autoload_real.php,然后再通过ClassLoader.php文件根据不同的加载方式,引入不同的文件。咱们要讲的就是ClassLoader。php里面的一段逻辑。
第一步,先从319行的loadClass方法开始执行,然后执行335行的findFile方法。最后来到了findFileWithExtension方法,即终点了。后面的几种方式就不提了,只解说372行到391行的psr-4方式的自动加载。敲黑板了,注意噢。
比如实例化new ControllercontrollerhomeController(),注意这里的Controller是命名空间,controllerhomeController是命名空间所在路径下的相对路径。
个人表达水平有限,不知您是否get了。最后说个注意的地方,使用自动加载的文件名称要与实例化时的类名一致,当然文件里面的类名也要一致。还有引入类里写的namespace,要搞清楚当前在命名空间指定目录下的相对位置。
页面更新:2024-04-27
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号