批改状态:合格
老师批语:以你目前的经验, 有一些东西, 还是要慢慢品的, 刚开始或许有一些迷茫, 觉得这样做是不是多此一举, 为什么这么简单的事, 搞得这么复杂,其实随着项目复杂度的不断提升, 现在的复杂会让未来的工作变得极其简单
<?phpnamespace app\controller;// 1. 类的命名空间与当前类文件的路径完全一致// 2. 类名称与类文件的名称完全一致// 4. 此时, 这个类就符合了PSR-4规范class User{public static function hello(){return __METHOD__;}}
<?php// 1. 传统方式: include / require// 加载类文件require 'app/controller/User.php';// 注册类别名[可选]use app\controller\User;// 调用类成员echo User::hello();
<?php// 2. 注册自动加载函数// 加载类文件使用一个内置的函数来完成spl_autoload_register(function($class){// 获取类的路径名称$path = str_replace('\\', DIRECTORY_SEPARATOR, $class);// 生成一个完整的类文件名$classFile = __DIR__ . '/' . $path . '.php';// 加载类文件require $classFile;});// 注册类别名[可选]use app\controller\User;// 调用类成员echo User::hello();
{"autoload": {"files": ["app/controller/User.php","lib/Order.php","lib/Goods.php"]}}
{"autoload": {"classmap": ["app/controller","lib"]}}
{"autoload": {"psr-4": {"app\\controller\\": "app/controller","phpcn\\": "lib"}},"require": {"gregwar/captcha": "^1.1"}}
以上所有的三种方法中需要注意:
<?php// 调用的是composer中的自动加载功能require_once __DIR__ . '/vendor/autoload.php';// 注册类别名[可选]use app\controller\User;use phpcn\Order;// 调用类成员echo User::hello();echo '<hr>';// 调用lib/Order::hello()echo Order::hello();
<?php// 1. composer require gregwar/captcha// 2. 更新composer.json中的require字段// 3. 下载包到vendor对应的目录下面// 4. 剩下就看组件包的用户手册// composer自动加载器require_once __DIR__.'/vendor/autoload.php';// 注册类use Gregwar\Captcha\CaptchaBuilder;// 创建验证器类实例/对象$captcha = new CaptchaBuilder;$captcha->build()->save('out.jpg');// 服务器端获取到验证码$_SESSION['phrase'] = $captcha->getPhrase();// 查看验证码,这块查看的目的是跟图片中的进行对照,看是否一致。// 后面要真实使用的话,肯定是需要进行验证码的匹对,然后是否允许通过:echo '验证码是: ' , $_SESSION['phrase'];?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><h3>用户登录</h3><div><label for="">邮箱:</label><input type="email" name="" id=""></div><div><label for="">密码:</label><input type="password" name="" id=""></div><div><label for="">验证码:</label><img src="<?php echo $captcha->inline(); ?>" onclick="location.reload()" /># 点击验证码就重新生成一个新的。</div><div><button>提交</button></div></body></html>
composer require catfan/medoocomposer require league/plates创建入口文件(index.php), 使用 composer 自动加载器进行测试
core下面的model.php文件
<?php// 模型类namespace core;use Medoo\Medoo;// 继承自第三方包:catfan/medooclass Model extends Medoo{// 构造方法: 连接数据库public function __construct(){$options = ['database_type' => 'mysql','database_name' => 'phpedu','server' => 'localhost','username' => 'root','password' => 'root'];parent::__construct($options);}// 自己可以封装一些方法,创建自己的模型方法库// 获取满足条件的集合中的第一条数据public function first(){}}
<?php// 视图类namespace core;use League\Plates\Engine;class View extends Engine{public $templates;public function __construct($path){$this->templates = parent::__construct($path);}}
<?phpnamespace models;use core\Model;// 用户自定义模型通常与一张数据表对应class UsersModel extends Model{public function __construct(){parent::__construct();}}
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户信息</title><style>body {display: flex;flex-direction: column;align-items: center;}table {border-collapse: collapse;border: 1px solid;width: 50%;text-align: center;}th,td {border: 1px solid;padding: 5px;}tr:first-child {background-color: #eee;}</style></head><body><h3>用户管理系统</h3><table><tr><th>id</th><th>姓名</th><th>邮箱</th><th>操作</th></tr><?php foreach ($users as $user): ?><tr><td><?=$this->e($user['id'])?></td><td><?=$this->e($user['name'])?></td><td><?=$this->e($user['email'])?></td><td><button>编辑</button><button>删除</button></td></tr><?php endforeach ?></table><p><a href="">1</a><a href="">2</a><a href="">3</a><a href="">4</a><a href="">5</a><a href="">6</a></p></body></html>
<?phpnamespace controllers;class UsersController{// 将依赖的外对模型对象和视图对象,使用依赖注入到构造方法中,使它在控制器中共享public $model = null;public $view = null;//构造方法public function __construct($model, $view){$this->model = $model;$this->view = $view;}// 用于测试public function index(){return __METHOD__;}// 这个相当于自己也可以创建一些东西public function select(){// 通过模型获取数据$users = $this->model->select('users', ['id', 'name','email'], ['id[>=]'=>5, 'LIMIT'=>5]);// return $users;// 将数据渲染到模板上(模板赋值同步完成)return $this->view->render('users/list', ['users'=> $users]);}}
{"require": {"catfan/medoo": "^1.7","league/plates": "^3.3"},"autoload": {"psr-4": {"models\\": "app/models","views\\": "app/views","controllers\\": "app/controllers","core\\": "core"}}}
<?php// composer加载器use controllers\UsersController;use models\UsersModel;use core\View;require_once __DIR__ . '/vendor/autoload.php';// 测试模型$model =new UsersModel();// var_dump($model);// 测试视图$view = new View('app/views');// var_dump($view);// 测试控制器$controller = new UsersController($model, $view);// var_dump($controller);// echo $controller->index();print_r($controller->select());
整体实现了一边,创建目录如下图:
后面还需要多联系,感觉很多精髓,尤其是多个文件,多个class以及多方法情况下,到底不同方法的差异、好处还没体会到(应该是越向后的方法越简单):
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号