老生常谈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


相关推荐: 如何在自有机房高效搭建专业网站?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何配置任务调度?(Cron Job示例)  iOS验证手机号的正则表达式  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何快速搭建FTP站点实现文件共享?  Android Socket接口实现即时通讯实例代码  浅谈javascript alert和confirm的美化  EditPlus中的正则表达式实战(5)  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  网站建设要注意的标准 促进网站用户好感度!  历史网站制作软件,华为如何找回被删除的网站?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  常州企业网站制作公司,全国继续教育网怎么登录?  如何登录建站主机?访问步骤全解析  如何在宝塔面板创建新站点?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  linux top下的 minerd 木马清除方法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Java垃圾回收器的方法和原理总结  如何用搬瓦工VPS快速搭建个人网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel如何使用Service Container和依赖注入?(代码示例)  零服务器AI建站解决方案:快速部署与云端平台低成本实践  node.js报错:Cannot find module 'ejs'的解决办法  网易LOFTER官网链接 老福特网页版登录地址  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何利用DOS批处理实现定时关机操作详解  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何使用查询构建器?(Query Builder高级用法)  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  米侠浏览器网页背景异常怎么办 米侠显示修复  Linux系统运维自动化项目教程_Ansible批量管理实战  深圳防火门网站制作公司,深圳中天明防火门怎么编码?