老生常谈PHP面向对象之命令模式(必看篇)

发布时间 - 2026-01-11 01:15:37    点击率:

这个模式主要由 命令类、用户请求数据类、业务逻辑类、命令类工厂类及调用类构成,各个类的作用概括如下:

1、命令类:调用用户请求数据类和业务逻辑类;

2、用户请求数据类:获取用户请求数据及保存后台处理后返回的结果;

3、业务逻辑类:如以下的示例中验证用户登陆信息是否正确的功能等;

4、命令工厂类(我自己取的名字,哈哈):生成命令类的实例;

5、调用类:调用命令类,生成视图;

直接看代码:

//命令类
abstract class Command {
  abstract function execute(CommandContext $context);
}

class LoginCommand extends Command{       //处理用户登陆信息的命令类
  function execute (CommandCotext $context){    //CommandCotext 是一个处理用户请求数据和后台回馈数据的类
    $manager = Registry::getAccessManager();  //原文代码中并没有具体的实现,但说明了这是一个处理用户登陆信息的业务逻辑类
    $user = $context->get('username');
    $pass = $context->get('pass');
    $user_obj = $manager->login($user,$pass);
    if(is_null($user_obj)){
      $context->setError($manager->getError);
      return false;
    }
    $context->addParam('user',$user_obj);
    return true;               //用户登陆成功返回true
  }
}

class FeedbackCommand extends Command{        //发送邮件的命令类
  function execute(CommandContext $context){
    $msgSystem = Registry::getMessageSystem();
    $email = $context->get('email');
    $msg = $context->get('msg');
    $topic = $context->get('topci');
    $result = $msgSystem->send($email,$msg,$topic);
    if(!$result){
      $context->setError($msgSystem->getError());
      return false;
    }
    return true;
  }
}

//用户请求数据类  
class CommandContext {
  private $params = array();
  private $error = '';

  function __construct (){
  $this->params = $_REQUEST;
}

function addParam($key,$val){
  $this->params[$key] = $val;
}

function get($key){
  return $this->params[$key];
}

function setError($error){
  $this->error = $error;
}

function getError(){
  return $this->error;
}
}


//命令类工厂,这个类根据用户请求数据中的action来生成命令类
class CommandNotFoundException extends Exception {}

class CommandFactory {
  private static $dir = 'commands';

  static function getCommand($action='Default'){
    if(preg_match('/\w',$action)){
      throw new Exception("illegal characters in action");
    }
    $class = UCFirst(strtolower($action))."Command";
    $file = self::$dir.DIRECTORY_SEPARATOR."{$class}.php"; //DIRECTORY_SEPARATOR代表'/',这是一个命令类文件的路径
    if(!file_exists($file)){
      throw new CommandNotFoundException("could not find '$file'");
    }
    require_once($file);
    if(!class_exists($class)){
      throw new CommandNotFoundException("no '$class' class located");
    }
    $cmd = new $class();
    return $cmd;
  }
}

//调用者类,相当于一个司令部它统筹所有的资源
class Controller{
  private $context;
  function __construct(){
    $this->context = new CommandContext();  //用户请求数据
  }
  function getContext(){
    return $this->context;
  }

  function process(){
    $cmd = CommandFactory::getCommand($this->context->get('action'));    //通过命令工厂类来获取命令类
    if(!$comd->execute($this->context)){                      
      //处理失败
    } else {
      //成功
      // 分发视图
    }
  }
}

// 客户端
$controller = new Controller();
//伪造用户请求,真实的场景中这些参数应该是通过post或get的方式获取的,貌似又废话了:)
$context = $controller->getContext();
$context->addParam('action','login');
$context->addParam('username','bob');
$context->addParam('pass','tiddles');
$controller->process();

以上这篇老生常谈PHP面向对象之命令模式(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# php面向对象命令模式  # 用户登陆  # 这是一个  # 给大家  # 是一个  # 老生常谈  # 希望能  # 这篇  # 必看  # 话了  # 小编  # 发送邮件  # 大家多多  # 面向对象  # 是否正确  # 客户端  # 应该是  # 但说  # 景中  # 调用者  # user 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用搬瓦工VPS快速搭建个人网站?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  如何在VPS电脑上快速搭建网站?  Laravel如何使用Blade模板引擎?(完整语法和示例)  油猴 教程,油猴搜脚本为什么会网页无法显示?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  如何在阿里云香港服务器快速搭建网站?  WEB开发之注册页面验证码倒计时代码的实现  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel用户密码怎么加密_Laravel Hash门面使用教程  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  免费视频制作网站,更新又快又好的免费电影网站?  如何在云主机快速搭建网站站点?  如何获取上海专业网站定制建站电话?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  JS弹性运动实现方法分析  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在IIS中新建站点并配置端口与物理路径?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何在云指建站中生成FTP站点?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Android自定义listview布局实现上拉加载下拉刷新功能  javascript读取文本节点方法小结  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  JavaScript如何实现倒计时_时间函数如何精确控制  浅谈javascript alert和confirm的美化  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  bing浏览器学术搜索入口_bing学术文献检索地址  高端网站建设与定制开发一站式解决方案 中企动力  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  ,在苏州找工作,上哪个网站比较好?  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  如何快速上传自定义模板至建站之星?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  如何快速选择适合个人网站的云服务器配置?  怎么用AI帮你设计一套个性化的手机App图标?  利用JavaScript实现拖拽改变元素大小  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在阿里云ECS服务器部署织梦CMS网站?