博客列表 >composer自动加载器和自撸框架

composer自动加载器和自撸框架

王佳祥
王佳祥原创
2020年08月10日 10:05:52891浏览

composer自动加载器和自撸框架

一、composer自动加载器



1.传统方式加载类文件

  1. <?php
  2. //1.传统方式:include / require
  3. //加载类文件
  4. require 'app/controller/User.php';
  5. //注册类别名
  6. use app\controller\User;
  7. //调用类成员
  8. echo User::hello();


2.注册自动加载函数

  1. <?php
  2. //2.注册自动加载函数
  3. //加载类文件使用一个内置的函数来完成
  4. spl_autoload_register(function($class){
  5. //获取类的路径名称
  6. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  7. //生成一个完整的类文件名
  8. $classFile = __DIR__ . '/' . $path . '.php';
  9. //加载类文件
  10. require $classFile;
  11. });
  12. use app\controller\User;
  13. echo User::hello();


3.使用composer的自动加载

  1. <?php
  2. //3.使用composer中的自动加载
  3. //调用的是composer中的自动加载功能
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. use app\controller\User;
  6. echo User::hello();
  • 在composer.json文件中注册自动加载 命名空间\\ :路径
    1. {
    2. "autoload": {
    3. "psr-4": {
    4. "app\\controller\\": "app/controller"
    5. }
    6. },
    7. "require": {
    8. "gregwar/captcha": "^1.1"
    9. }
    10. }


4.在项目中使用第三方依赖库/组件

  1. <?php
  2. //如何在项目中使用第三方依赖库/组件
  3. //composer自动加载器
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. //注册类(验证码)
  6. use Gregwar\Captcha\CaptchaBuilder;
  7. $captcha = new CaptchaBuilder;
  8. $captcha
  9. ->build()
  10. ->save('out.jpg');
  11. //获取验证码
  12. $_SESSION['phrase'] = $captcha->getPhrase();
  13. echo $_SESSION['phrase'];
  14. ?>
  15. <!DOCTYPE html>
  16. <html lang="en">
  17. <head>
  18. <meta charset="UTF-8">
  19. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  20. <title>Document</title>
  21. </head>
  22. <body>
  23. <table>
  24. <caption>用户登录</caption>
  25. <tr>
  26. <td>邮箱:</td>
  27. <td><input type="email"></td>
  28. </tr>
  29. <tr>
  30. <td>密码:</td>
  31. <td><input type="password"></td>
  32. </tr>
  33. <tr>
  34. <td>验证码:</td>
  35. <td><img src="<?php echo $captcha->inline();?>" onclick="location.reload()" alt=""></td>
  36. </tr>
  37. <tr>
  38. <td colspan="2"><button>登录</button></td>
  39. </tr>
  40. </table>
  41. </body>
  42. </html>


二、自撸框架

1.采用mvc架构

  • 模型,视图,控制器

2.下载第三方模型、视图包

  • 模型用medoo包,用终端下载:输入composer require catfan/medoo命令

  • 视图用plates包,输入composer require league/plates命令

3.创建自己的核心代码,分别继承第三方包

  • Model.php继承medoo包
  1. <?php
  2. //模型类
  3. namespace core;
  4. use Medoo\Medoo;
  5. //继承自第三方包:catfan/medoo
  6. class Model extends Medoo
  7. {
  8. //构造方法:连接数据库
  9. public function __construct()
  10. {
  11. $options = [
  12. 'database_type'=>'mysql',
  13. 'database_name'=>'tp5',
  14. 'server'=>'localhost',
  15. 'username'=>'root',
  16. 'password'=>'wang1111'
  17. ];
  18. parent::__construct($options);
  19. }
  20. }
  • View.php继承plates包
  1. <?php
  2. //视图类
  3. namespace core;
  4. use League\Plates\Engine;
  5. class View extends Engine
  6. {
  7. public $templates;
  8. public function __construct($path)
  9. {
  10. $this->templates = parent::__construct($path);
  11. }
  12. }

4.按MVC框架创建属于自己的应用

  • 创建一个目录,目录下再按mvc框架创建三个子目录,model、view、controller


  • 模型:UsersModel.php
  1. <?php
  2. namespace models;
  3. use core\Model;
  4. //用户自定义模型通常与一张数据表对应
  5. class UsersModel extends Model
  6. {
  7. public function __construct()
  8. {
  9. parent::__construct();
  10. }
  11. }
  • 控制器:UsersController.php
  1. <?php
  2. namespace controllers;
  3. class UsersController
  4. {
  5. //将依赖的模型对象和视图对象,使用依赖注入到构造方法中,使它在控制器中共享
  6. public $model = null;
  7. public $view = null;
  8. //构造方法
  9. public function __construct($model,$view)
  10. {
  11. $this->model = $model;
  12. $this->view = $view;
  13. }
  14. public function index()
  15. {
  16. return __METHOD__;
  17. }
  18. public function select()
  19. {
  20. $users = $this->model->select('user',['id','name','username'],['LIMIT'=>5]);
  21. //将数据渲染到模板上(模板赋值同步完成)
  22. return $this->view->render('users/list',['users'=>$users]);
  23. }
  24. }
  • 视图:list.php
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>用户信息</title>
  7. </head>
  8. <body>
  9. <table border="1" cellpadding="10px" cellspacing="0">
  10. <caption>用户管理</caption>
  11. <tr>
  12. <th>id</th>
  13. <th>姓名</th>
  14. <th>账号</th>
  15. </tr>
  16. <?php foreach($users as $user): ?>
  17. <tr>
  18. <td><?=$this->e($user['id'])?></td>
  19. <td><?=$this->e($user['name'])?></td>
  20. <td><?=$this->e($user['username'])?></td>
  21. </tr>
  22. <?php endforeach; ?>
  23. </table>
  24. </body>
  25. </html>

5.用composer.json实现自动加载

  1. {
  2. "require": {
  3. "catfan/medoo": "^1.7",
  4. "league/plates": "^3.3"
  5. },
  6. "autoload": {
  7. "psr-4": {
  8. "models\\": "app/models",
  9. "core\\": "core",
  10. "views\\": "app/views",
  11. "controllers\\": "app/controllers"
  12. }
  13. }
  14. }
  • composer dumpautoload 更新类的映射关系

6. 创建入口文件index.php

  1. <?php
  2. use models\UsersModel;
  3. use core\View;
  4. use controllers\UsersController;
  5. //composer加载器
  6. require_once __DIR__ . '/vendor/autoload.php';
  7. //测试模型
  8. $model = new UsersModel();
  9. //var_dump($model);
  10. //测试视图
  11. $view = new View('app/views');
  12. //var_dump($view);
  13. //测试控制器
  14. $controller = new UsersController($model,$view);
  15. //var_dump($controller);
  16. print_r($controller->select());
  • 测试模型:


  • 测试视图:


  • 测试控制器




声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议