假设我的项目其中的一个目录:
app
== site
==== controller
====== IndexController.php
====== AccessController.php
== api
==== controller
====== PostController.php
假设 IndexController.php 的内容:
namespace appsitecontroller;
class IndexController {
// some code
}
项目是单入口,包含了 function autoload($className),我的问题:
假设项目约定了 namespace 中的名称必须和文件夹名称一致,并且类名称也和类文件同名(不包含下划线等奇怪的字符),那这样的话,$className 其实只需要把右斜杠换成 DIRECTORY_SEPARATOR 就可以找到对应的类文件了,比如:
$obj = new appsitecontrollerIndexController();
或者
class TestClass extends appsitecontrollerIndexController {}
那 autoload 实际找到的就是 /app/site/controller/IndexController.php。
既然这样,那为什么 thinkphp 里面的 Think 类还要 $_map 呢?类似的还有 laravel 里的:
autoload_namespaces.php
autoload_classmap.php
autoload_psr4.php
比如这个是 autoload_psr4.php 里的内容:
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'yii\\swiftmailer\\' => array($vendorDir . '/yiisoft/yii2-swiftmailer'),
'yii\\gii\\' => array($vendorDir . '/yiisoft/yii2-gii'),
'yii\\faker\\' => array($vendorDir . '/yiisoft/yii2-faker'),
'yii\\debug\\' => array($vendorDir . '/yiisoft/yii2-debug'),
'yii\\composer\\' => array($vendorDir . '/yiisoft/yii2-composer'),
'yii\\codeception\\' => array($vendorDir . '/yiisoft/yii2-codeception'),
'yii\\bootstrap\\' => array($vendorDir . '/yiisoft/yii2-bootstrap'),
'yii\\' => array($vendorDir . '/yiisoft/yii2'),
'cebe\\markdown\\' => array($vendorDir . '/cebe/markdown'),
'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'),
);
这里面通过数组定义的映射有什么作用啊?
composer里的自动加载可以支持四种规范,psr-0(autoload_namespaces.php),psr-4,class-map,还有files,你如果自己写代码,这样约定好了,命名空间和路径保持一致,然后autoload加载按路径加载,当然不需要classmaps,但是很多类库是其他人写的,每个人习惯不一样,有的人喜欢psr-4,有的人喜欢psr-0,(大家规范都一样,声明的命名空间和路径不一样)时,就需要你说的 Classmap了,你可以看下composer的loader类
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。