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

以往写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种方式为例):

8dac9dfe2ceccbba86a76756d3d31ab4.png

之后,便是分析$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类已经通过了重重考验,不要再动它了,再说,这也不符合面向对象的原则之一:对扩展开放,对修改关闭

3bb5d8a4e39d5f45bdf89e3485c7d759.png

使用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下运行的模块直接调用各位小伙伴,请在评论中留下你的见解。

举报/反馈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决?,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决?易采站长站,站长之家为您整理了php gd库中文乱码怎么解决?的相关内容。解决方法:1、网站整站使用UTF8编码,如果已使用GB2312…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题:JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果,Java悬浮广告,郑州SEO提供以下代码,仅供参考:飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包,默认PostgreSQL是没有的,需要安装orafce包来实现…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果),VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…

kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...

为了解决Windows远程桌面访问Ubuntu 12.04 之一 中提到的VNC远程桌面的缺点(见http://www.linuxidc.com/Linux/2012-07/64801.htm),我们采用第二种方法XRDP,该方法支持多用户登录并远程桌面。1、首先参考Windows远程桌面访问Ubuntu 12.04 之安装VNC中提到…

linux装redis环境变量,linux 怎样安装redis

人到中年有点甜获取Redis1、通过官网http://redis.io/获取稳定版源码包下载地址;2、通过wget http://download.redis.io/releases/redis-3.0.2.tar.gz下载 源码包;2编译安装Redis1、解压源码安装包,通过tar -xvf redis-3.0.2.tar.gz解压源码&…

word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符

word文件中有换行符很正常,但是想要将换行符全部替换为回车符,该怎么替换?以下是学习啦小编为您带来的关于word文章中的换行符批量替换为回车符,希望对您有所帮助。word文章中的换行符批量替换为回车符1、在打开的word中,依次点击…

linux禁用防火墙配置,CentOS Linux防火墙配置及关闭

最近在CentOS Linux下安装配置 Oracle 数据库的时候,总显示因为网络端口而导致的EM安装失败,遂打算先关闭一下防火墙。偶然看到防火墙的配置操作说明,感觉不错。执行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码:#include int main(){int n1;int m2;switch(n){case 1:m;case 2:n;case 3:switch(n){case 1:n;case 2:m;n;break;}case 4:m;break;default:break;}printf("%d %d",m,n);return 0;}代码看起来很简单&#xff0c…

linux dd 进度条,Progress 进度条 – DDProgressHUD

DDProgressHUDProgress 进度条,UIActivityIndicatorView 小菊花,弹窗,状态显示,高度自定义DDProgressHUD的介绍提供了四种类型的展示:显示无限旋转的加载图(比如小菊花,可以自定义),显示文字信息…

Android动态图标包制作教程,安卓手机ico图标制作美化图文教程

如何让手机更加与众不同?今天我们就来学习如何利用出色的ico图标制作软件——Axialis IconWorkshop制作出美化手机屏幕的个性图标!如今,每个人都有属于自己的手机,每天使用手机聊QQ、刷微博、玩游戏,可以说手机已经是很多人生活中不可缺少的…

android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式

果:和之前的一样,在布局文件中:android:id"id/progressBar3"android:layout_width"wrap_content"android:layout_height"wrap_content"android:indeterminate"false"android:indeterminateDrawable&…

android gridview行分割线,Android使用GridView实现表格分割线效果

使用gridview实现表格分割线效果,网格布局表格布局也是可以实现的。效果如下:1.主函数代码:package com.example.qd.douyinwu;import android.app.activity;import android.content.context;import android.os.bundle;import android.support…

android hook 实例,代码实例分析android中inline hook

以下内容通过1、实现目标注入程序,2、实现主程序,3、实现注入函数,4、thumb指令集实现等4个方面详细分析了android中inline hook的用法,以下是全部内容:最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍&#xf…

dax 筛选 包含某个字_筛选状态(ALL与REMOVEFILTERS)

这一章比较绕,但是帮助我们理清切片器的筛选状态以及主要函数对于公式筛选上下文的改变。1.切片器的筛选状态切片器的全选与全不选的状态的区别,我们可以看下图:全不选全选多个点击筛选逐个点击至全部结论初始状态,没有选择任何元…

山东鲁能轨道智能巡检机器人_温湿度传感器在轨道巡检机器人中的应用

▲地下综合管廊智慧管廊建设,是智慧城市在地下的一个缩影,有助于缓解“大城市病”,实现精细化和动态管理。与此同时,各种传感器技术也将被运用到地下综合管廊运维的每一环,这其中,地下管廊巡检机器人便是其…

android显示网络图片控件,Android控件之ImageView(二)

前言在上一篇文章中,我们讲解了如何加载本地图片,那么在实际项目中 ImageView 大多数使用场景是加载网络图片,网络图片其实就是存储在服务器上的文件,我们需要从服务器获取到文件的二进制输入流 Inpustream ,然后将其转…

坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模

曲面流动可以建什么模型?这样的▼这样的▼还有这样的▼那究竟如何使用曲面流动呢?本文告诉你!曲面流动是什么?曲面流动功能相当于Rhino(犀牛)中的“沿曲面流动”命令,可以使来源几何体群组或组件,根据基准平面为参照,…

android o 结构光流程,惊艳亮相!一分钟看懂OPPO Find X 3D结构光技术是什么鬼,太牛了...

法国时间6月19日,OPPO在巴黎卢浮宫正式举办未来旗舰Find X发布会。此次亮相的Find X新机,既有充满艺术感的3D玻璃机身设计,又有3D结构光、曲面全景屏、双轨潜望结构等多项黑科技。众多黑科技中,以3D结构光O-face最受数目。据悉&am…

jframe运行和预览大小不一样_同一款车型,为什么配的轮胎大小还会不一样?【内含福利】...

小编又来给大家送福利啦~阅读完文章之后 戳文章底部阅读原文 岁末巨献 国货好胎!免费体验价值1999元国产轮胎!相信有不少朋友,买车的时候一定会有类似的经历。选车、试驾的时候,看到试驾车配置相当漂亮,尤其搭配的轮圈…