不得不说的Composer

3.5.2 composer自动加载:classmap

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"声明和路径是风马牛不相及的,这样也可以,虽然非常不推荐这么做。

  • 没有任何评论
回复 @abc
登录后才可发表评论 | 登录