批改状态:合格
老师批语:
我们在使用一个类的时候,传统方式是需要先引入这个类文件,再进行使用。下面是一个传统方式操作类。
首先我们在创建两个类文件: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配置项。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号