classmap可以指定若干个目录,composer将扫描此目录下所有类文件并进行自动加载,不同于psr-4,用classmap声明的目录中类的命名空间可以不与目录产生关联,甚至可以“胡作非为”,当然,事实上还是建议遵循psr-4规范。
例如,在项目中有一个lib目录,下面放一些类文件,结构如下:
lib/Service/User.php
lib/Bill.php
注意,Bill.php和Service目录是同级,这里假装“胡作非为”一下。
现在需要自动加载lib目录下的所有类,则在composer.json的autoload下增加“classmap”:
{
"require": {
"mustache/mustache": "^2.11"
},
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"lib"
]
}
}
lib/Service/User.php 文件内容:
<?php
namespace Libs\Service;
class User
{
public function getName()
{
return 'Tom';
}
}
lib/Bill.php 文件内容:
<?php
namespace Libs\Repos;
class Bill
{
public function getTitle()
{
return 'juice';
}
}
执行命令:
composer dumpautoload
index.php 文件内容:
<?php
require 'vendor/autoload.php';
$user = new Libs\Service\User();
var_dump($user);
echo $user->getName();
echo "\n";
$bill = new \Libs\Repos\Bill();
var_dump($bill);
echo $bill->getTitle();
执行命令:
php index.php
结果:
注意,"lib/Bill.php"的命名空间"Libs\Repos"声明和路径是风马牛不相及的,这样也可以,虽然非常不推荐这么做。