我们在使用一个类的时候,传统方式是需要先引入这个类文件,再进行使用。下面是一个传统方式操作类。
首先我们在创建两个类文件:UserController .php
和 OrderController.php
,将这两个文件放在application/controllers
目录下。
namespace app\controllers;
class UserController
{
public function index()
{
return __METHOD__;
}
}
namespace app\controllers;
class OrderController
{
public function index()
{
return __METHOD__;
}
}
再创建一个demo.php
的文件与application
目录同级,我们在这个文件里面别分调用上述创建的两个类文件的index()
方法。
namespace edu;
// ---------------------------------------------------
// 以下是传统方式访问
require 'application/controllers/UserController.php';
require 'application/controllers/OrderController.php';
// ---------------------------------------------------
use app\controllers\UserController;
use app\controllers\OrderController;
$user = new UserController;
echo $user->index();
echo '<hr>';
$order = new OrderController;
echo $order->index();
这样操作对于一两个类文件还行,如果一旦文件多了的话,那么这样的操作就变得非常繁琐了,因此我们可以利用composer的自动加载来实现。那么,具体是如何实现,可以按照以下步骤来操作。
首先,在application
同级目录下创建一个composer.json
文件,里面内容留空。
{}
然后在命名行进入到项目的根目录下,执行composer install
命令。
执行完composer install
命令之后,会自动生成一个composer.lock
的锁文件,还有一个vendor
目录。
在生成的vendor
目录下,我们主要通过加载autoload.php
文件来实现类的自动加载。
在生成了相关的composer目录和文件之后,我们在composer.json
中配置需要加载的类的映射。有三种方法可以自动加载类,下面一一举例。
此时composer.json
中的配置应该这样写:
{
"name": "vendor/demo",
"description": "This is a autoload demo",
"autoload": {
"files": [
"application/controllers/UserController.php",
"application/controllers/OrderController.php"
]
}
}
注意:在配置完json文件之后,必须要在命令行执行一下composer dump-autoload
命令更新composer.json
中的autoload
配置项。
namespace edu;
// ---------------------------------------------------
// 以下是传统方式访问
// require 'application/controllers/UserController.php';
// require 'application/controllers/OrderController.php';
// ---------------------------------------------------
// 如果我们有多个类文件需要导入,这样加载太麻烦,可以利用composer的自动加载来实现。
// 引入 ` vendor/autoload.php `文件即可导入所需的类。
require 'vendor/autoload.php';
use app\controllers\UserController;
use app\controllers\OrderController;
$user = new UserController;
echo $user->index();
echo '<hr>';
$order = new OrderController;
echo $order->index();
我们通过配置需要导入的类的路径,将需要加载的逐个导入,但是这里也有个很大的问题,就是如果我们需要100个类,那么就必须导入100次,这样,问题又跟传统的加载方式一样了,所以这个方法是不可取的。
此时composer.json
中的配置应该这样写:
{
"name": "vendor/demo",
"description": "This is a autoload demo",
"autoload": {
"classmap": [
"application/controllers"
]
}
}
将需要导入的类的文件夹做一个映射,代码中的application/controllers意思就是导入该文件夹下的所有类文件,调用方法同上。
此时composer.json
中的配置应该这样写:
{
"name": "vendor/demo",
"description": "This is a autoload demo",
"autoload": {
"psr-4": {
"app\\": "application\\"
}
}
}
使用这种方法自动加载的时候,在配置命名空间时必须带上命名空间分隔符\
,否则会报错。
最后需要说的一点是,以上三种方法,无论是哪一种,最后都要执行一下composer dump
更新composer.json
中的autoload
配置项。