以往写cli下运行的业务或者测试代码,总是新建文件,面向过程编写代码。几次之后,cli目录下好多文件,即便勉强在一个cli测试文件中写了一个类,也是让其中的一个方法自启动,要测试别的方法,总是要修改代码,很是繁琐。昨天接触了phalcon的cli, 犹如醍醐灌顶, 特此发文分享。

首先,温故而知新:

在浏览器中访问php:

http(s)://test.php.local/index.php?m=front&c=order&a=getList&p=2&cate=1调试期间,每次都敲m、c、a,太繁琐了,url简化一下:

http(s)://test.php.local/index.php/front/order/getList?p=2&cate=1然后,index.php会做的事情必定包括:

加载配置文件加载Autoload.php, 各种function.phpDispatcher::run();初始化Db类(此时并没有连接mysql)分析url, 得到front/order/getList, 之后,$obj = new /app/front/controller/Order();$obj->getList(); //别担心Autoload类帮我们自动加载类文件....在cli中,我们这样访问php:(先用cd进入项目根目录)

php public/cli.php--m cli --c order --a updateMarketPrice --param value文件名之后,就是“--参数 值 --参数 值 ” 这么有规律,可以直接用getopt()获取m、c、a参数:

$arr = [ 'm:', 'a:', 'c:' ];$mca = getopt( '', $arr );注意,如果企图简化为:

php public/cli.php/cli/order/updateMarketPrice --param value那么在linux中,public/cli.php/cli/order/updateMarketPrice会被认为是一个文件,因为不存在,导致打开失败

据本猿所知,有2种简化方式:

php public/cli.php cli/order/updateMarketPrice --param value或者php public/cli.php cli order updateMarketPrice --param value文件名之后,不是以--开头, getopt()不认识,就罢工了,还好有php自带的全局变量$argv,它是一个数组(以第2种方式为例):

之后,便是分析$argv这个数组,取得m、c(此处实际应该叫t, task)、a, 组合数组$paramsArr, 以便给业务方法用。

cli.php必然也做以下事情:

加载配置文件加载Autoload.php, 各种function.phpCliDispatcher::run();初始化Db类(此时并没有连接mysql)分析url, 得到front/order/getList, 之后,$obj = new /app/cli/task/Order(); $obj->updateMarketPrice($paramsArr); //别担心, Autoload类帮我们自动加载类文件....注意:

另起CliDispatcher类。 Dispatcher类已经通过了重重考验,不要再动它了,再说,这也不符合面向对象的原则之一:对扩展开放,对修改关闭

使用Task而不是controller, 是为了避免这样的情况:控制器中业务需要调用cli模块中的方法发送微信模板消息什么的,代码写着写着,走神了,直接new /app/cli/task/Order();

由于AutoLoad类认定控制器一定在controller目录在,而cli模块却是放在task目录下,导致加载失败,抛出错误, 同时输出建议,就像一盆凉水一样立即“浇醒”开发者,想想,要是cli模块是放在controller目录下, 还被顺利执行...

和cgi下不同,没有$_GET, 没有$_POST, 而且$_SERVER中关于url的各种信息也是没有的,记得给予参数,不然,取参(“餐”)无门..

$obj->updateMarketPrice($paramsArr);

cli模块的各种logic类, 记得判断是否php是否在cli下运行,以免被其他cig下运行的模块直接调用各位小伙伴,请在评论中留下你的见解。

举报/反馈

php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?相关推荐

  1. linux bmp图片应用编程,在Framebuffer下编程显示BMP图象 分享

    http://yaos.blog.sohu.com/20240931.html 今天看别人的代码,知道可以使控制台进入图形模式,这样SHELL程序的显示就不会影响BMP图像的显示了.于是,COPY过来 ...

  2. 为什么在Unix下编程,而不在Linux下编程

    现在Linux是网络上相对火爆的词语,仅在Google中搜索关键词"Linux"就有4亿6千万的页面数:求职时如果你只会个Windows根本就不好意思与人打招呼,会个Unix怕别人 ...

  3. GUI编程与CLI编程

    作为一名多年的iOS开发人员,多次触发我思酌"GUI编程与CLI编程"各自的优劣,尤其是在当我为界面交互花费大占比时间时,时常怀疑自己的工作性质,我终究还是为互联网工作的码农,而不 ...

  4. 【转】C++/CLI简介(什么是C++/CLI) -------C++/CLI 编程系列一

    要知道C++/CLI是什么,首先知道什么是CLI. 一.CLI简介 CLI:(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环 ...

  5. 使用Keil语言的嵌入式C编程教程(下)

    使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...

  6. 四川大学线下编程比赛第一题:数字填充

    四川大学线下编程比赛第一题:数字填充 公布公司: 有 效 期: CSDN 2014-09-27至2015-09-26 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Jav ...

  7. linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...

    原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...

  8. turbo c图形方式下编程小技巧

    turbo c图形方式下编程小技巧 Turbo C具有丰富的图形功能,在用其编写各种应用程序和菜单时 ,常常需要将光标定位输入数据和显示立体字型,而Turbo C本身又没 有直接提供可以使用的函数,往 ...

  9. Madagascar环境下编程

    [引用][原创]Madagascar环境下编程 (2013-07-17 04:50:34) 转载▼ 标签: 教育 分类:madagascar 本文转载自seismig<[原创]Madagasca ...

最新文章

  1. 如何面试java后端_近期面试Java后端的一些感悟
  2. COBOL入门到精通
  3. 学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS
  4. 第十五周程序阅读-范型程序设计(5)
  5. java list字符排序吗_List中存放字符串进行排序
  6. python处理u开头的字符串
  7. 【面试题22】栈的压入、弹出序列
  8. 表面上承认错误_做一个可以承认错误的领导者
  9. 【机器学习】ICA 原理以及相关概率论,信息论知识简介
  10. Shell:Lite OS在线调试工具知多少
  11. JQuer实战第一讲:验证用户名是否可用
  12. centos6下安装php7的memcached扩展
  13. Spring Cloud Consul
  14. mysql数据库安全怎么设置密码_关于mysql的数据库的安全问题
  15. 黑盒测试方法-----状态转换图
  16. elaticsear学习常见错误
  17. iconfont怎么添加新的字体图标?
  18. 洛谷P4394 [BOI2008]Elect 选举 题解
  19. Spring之ApplicationContext介绍
  20. Codeforces Round #742 (Div. 2) C. Carrying Conundrum(思维)

热门文章

  1. 跨平台RTSP/RTMP转RTMP转发SDK
  2. android如何获得开发者权限,Android 动态权限获取 超级简单的方式
  3. android 聊天功能实现,Android聊天背景功能实现
  4. spring的动态代理,碰到了一个类型转换的问题:java.lang.ClassCastException: com.sun.proxy.$Proxy16 cannot be cast to com.
  5. android hud sdk,Android HUD SDK | 百度地图API SDK
  6. MySQL 基础 ———— 流程控制结构
  7. Linux进阶之路————用户管理
  8. JAVA中注解controller_SpringMVC之基于注解的Controller
  9. # 解析bt文件_BT、磁力链这些词语是什么意思?
  10. oracle关联分组查询,oracle中关联查询、分组查询