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


Posted in PHP onMay 24, 2017

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

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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
php读取javascript设置的cookies的代码
Apr 12 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
PHP实现微信公众平台音乐点播
Mar 20 PHP
php自定义加密与解密程序实例
Dec 31 PHP
memcache一致性hash的php实现方法
Mar 05 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
php经典算法集锦
Nov 14 PHP
理解PHP中的Session及对Session有效期的控制
Jan 08 PHP
Yii2单元测试用法示例
Nov 12 PHP
php json中文编码为null的解决办法
Dec 14 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
php实现查询功能(数据访问)
May 23 #PHP
php批量删除操作(数据访问)
May 23 #PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 #PHP
php出租房数据管理及搜索页面
May 23 #PHP
Yii框架创建cronjob定时任务的方法分析
May 23 #PHP
php注册审核重点解析(数据访问)
May 23 #PHP
php + nginx项目中的权限详解
May 23 #PHP
You might like
PHP中的CMS的涵义
2007/03/11 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
PHP asXML()函数讲解
2019/02/03 PHP
JavaScript类和继承 constructor属性
2010/03/04 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
Python中一些不为人知的基础技巧总结
2018/05/19 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
python使用建议与技巧分享(二)
2020/08/17 Python
python开发一款翻译工具
2020/10/10 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
在Python中实现字典反转案例
2020/12/05 Python
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
一些.net面试题
2014/10/06 面试题
优秀管理者获奖感言
2014/02/17 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
销售队伍口号
2014/06/11 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
工程部文员岗位职责
2015/02/04 职场文书
应聘教师自荐信
2015/03/26 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
公司年会主持词范文!
2019/05/07 职场文书
Redis高并发缓存架构性能优化
2022/05/15 Redis