沈逸老师PHP魔鬼特训笔记(12\13) --异形
我们常见的访问约定方式一:/index.php?m=xx&a=oo.其中m和a是固定参数名,
1、m的值(假设xx是index):代表我们的代码文件名、类名肯定和index有关
2、a的值:代表代码文件中有个方法叫做OO。
日常工作中为了规范,我们会把XX设定为一个类。
常见约定访问方式二:/index.php/xxx/ooo
其实这个和前面类似,我们可以通过index.php获取当前用户访问的整个url地址,通过各种街区或则$_SERVER['PATH_INFO']后,获取/xxx/ooo这个字符串。而XXX这里代表某类,ooo代表某方法。
几个注意事项:1、如果你发现你的php不支持path_info请打开。
2、如果index.php后面不加path参数,则这个变量是不存在的。因此要做判断。
3、到了生产环境中可以使用htaccess对所有访问全部重新到path_info 模式的地址。
以上是常见框架的基本原理,但这不是我们想要的。
先来看看我们的基本约定:
1、凡是所谓的控制器,都必须是xxx.class.php这样的形式。
2、类名和文件名(第一段)必须一致。
3、在类名上必须写上注释
/** *@Controller //代表是一个控制器,否则它仅仅是一个普通类 */
接下我们开始一个新的实验,在GOD里创建一个新的类叫god_mvc用于处理这些Controller。主要实现下面这些功能:1、构造函数,接受类名参数,用户创建反射。2、判断函数,用于判断是否controller.3、获取所有的方法的注释,解析@RequestMapping(里面的内容)。
<?phpnamespace core\frame; class god_mvc {public $className="";//传入的类名public $classComment="";public $classMethods=array();function __construct($cname) //接受一个classname(类名) {$this->className=$cname;$f=new \ReflectionClass($cname);$this->classComment=$f->getDocComment();$this->classMethods=$f->getMethods();//获取类里面所有的方法集合 ,返回一个 方法对象数组 }function isController(){return preg_match("/@Controller/",$this->classComment);}function getReqestMapping(){$result=array();foreach($this->classMethods as $method){$get_res=$this->genReqestMappingResult($method);if($get_res){$result=array_merge($result,$get_res);}}return $result;}function genReqestMappingResult($m){//index.php/getme/eme/age//@RequestMapping("/getme",Method=GET);if(preg_match('/@RequestMapping\("(?<RequestUrl>.{2,50})",Method=(?<RequestMethod>\w{3,8})\);/',$m->getDocComment(),$result)){return array($result['RequestUrl']=>array('RequestMethod'=>$result['RequestMethod'],"Class"=>$this->className,'Method'=>$m->getName()));}return false;} }?>
god_frame文件中的compile()方法我们增加获取加载所有类的代码。
function compile(){ //将code里的重复变量读取出来处理掉$_files = scandir($this -> project_folder.'/code');foreach($_files as $_file){if(preg_match("/\w+\.var|func\.php$/i",$_file)){require ($this->project_folder.'/code/'.$_file);unset($_file);}}unset($_files);//销毁这个无效的变量//var_export(get_defined_vars());$result = '<?php '.PHP_EOL.'ectract('.var_export(get_defined_vars(),1).');';file_put_contents($this->project_folder."/vars.php",$result);$getFunc = get_defined_functions()["user"];$getFunc = array_slice($getFunc,6); //去掉GOD程序创建的函数$func_set="";foreach ($getFunc as $func){$f = new \ReflectionFunction($func);$start = $f->getStartLine(); //获取该函数的启始行号$end = $f->getEndLine(); //获取该函数的末尾行号$fileList = file($f-> getFileName());$func_set.=implode(array_slice($fileList,$start-1,$end-$start+1));}//生成到项目文件夹,文件名是functionsfile_put_contents($this->project_folder."/functions",'<?php //compiled by GOD '.date('Y-m-d h:i:s').PHP_EOL.$func_set);/*$f = new \ReflectionFunction('showName');$start = $f->getStartLine(); //获取该函数的启始行号$end = $f->getEndLine(); //获取该函数的末尾行号$fileList = file($f-> getFileName());echo implode(array_slice($fileList,$start-1,$end-$start+1));*///获取已经加载的所有类$class_set=get_declared_classes(); $class_set=array_slice($class_set,array_search(__CLASS__,$class_set)+1);$result=array();foreach($class_set as $class){$mvc=new god_mvc($class);if($mvc->isController()){$mp=$mvc->getReqestMapping();$result=array_merge($result,$mp);}}//生成路由文件file_put_contents($this->project_folder."/request_route",'<?php return '.var_export($result,1).';');}
然后我来生成路由,把刚才生成所有方法的RequestMapping生成到项目目录下,取个名字叫做request_route.
知识点:
反射:1、ReflectionClass :对“类”进行反射,并获取相关信息。
2、学习获取类“注释”的方法
$f = new ReflectionClass(类名);
$doc = $f->getDocComment(); //获取注释
echo $doc
3、get_declared_classes()
4、__class__ PHP魔力变量 可以获取当前类名
转载于:https://www.cnblogs.com/xz1024/p/5864979.html
沈逸老师PHP魔鬼特训笔记(12\13) --异形相关推荐
- 沈逸老师PHP魔鬼特训笔记(3)
一.由于上两节课我们把程序放到了/usr/local/bin里面.每次编辑需要sudo .这节课我们使用PHPSTORM来编辑代码,专门把它拷贝出来,然后放到一个叫做home/godpro的文件夹下. ...
- 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展...
1.编译安装apache2.4.20 1 第一步: ./configure --prefix=/usr/local/httpd --enable-so 2 第二步: make 3 第三步: sudo ...
- OSS报表系统实训笔记
OSS报表系统 实训笔记 实训公司:中科天地 (王海格,老师超好) Edited by Hen Egg ,Michelangel ...
- 【研究报告】从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期)
从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期) 报告总结 & 相关论文 论文代码 相关术语 前言 研究问题 单目深度估计 单目三维场景重建 ...
- 沈逸康人物介绍沈逸康ABI-company创办人
沈逸康 人物介绍:沈逸康,ABIcompany创办人 中文名 :沈逸康 外文名 :SamShen 别 名 : 沈逸 国 籍 :中国 民 族 :汉 出生地 :湖北黄冈 出生日期 :19950829 职 ...
- 轻微课魔鬼特训班学员自述零基础学画画蜕变之路
学画画之路到底有多难?没有真正经历过的小白永远也不会有深刻的体会,但是自从遇到了轻微课,我的学画之路似乎变得更有动力和成就感. 轻微课是我学画道路上的第一位老师,也是我入门绘圈的引路人,在轻微课我接受 ...
- css+js+jq实训笔记
css+js+jq实训笔记 css第一天 css第二天 css第三天 css第四天 css第五天 css第六天 js第一天 js第二天 js第三天 js第四天 js第五天 js第六天 jq第一天 jq ...
- 大数据实训笔记10:hive的应用
目录 数据定义 数据仓库操作 数据仓库的创建 数据仓库的查询 数据仓库的修改 数据仓库的删除 表操作 内部表 外部表 分区表 桶表 表的修改 表的删除 视图 数据操作 数据导入 加载数据 插入数据 数 ...
- 专访沈逸:技术,不存在有前途没前途之分
沈逸认为,初级或中级程序员不要想太多,把自己产品做好.人脉积累广阔和基础打好,想要的东西顺其自然就会来. 沈逸,毕业于江苏常州工学院,经济管理学出身,<失业的程序员>真实创业经历文章作者. ...
最新文章
- Redis安装与调试
- java约瑟夫环 循环链表_约瑟夫环_循环链表JAVA解答
- GLPI生成中文PDF报表
- 计算机二级c语言109套,2016年9月计算机二级C语言操作题109套讲述.docx
- 亚马逊记AWS(Amazon Web Services)自由EC2应用
- boost::hana::id用法的测试程序
- 基于蒙特卡罗模拟的金融风险评估-函数调用关系图
- EditPlus 技巧大全:[1]怎么配置PHP编译环境
- 右键计算机无法进入管理员权限,电脑鼠标右键怎么添加取得管理员权限选项
- python 画三角函数_用Python计算三角函数之acos()方法的使用
- Day005 20210218-20210221
- Altova XMLspy安装简易步骤
- PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱
- 微信html5 下拉刷新,微信小程序下拉刷新:onPullDownRefresh正确使用姿势
- win10安装visio2010出错_Office2010安装过程中提示错误1907的三种解决方法
- Leco题目:寻找两个正序数组的中位数
- 企业上云成趋势 看超融合如何开箱即用、一步上云
- IOS UILabel 多行文字自动换行
- 【财务架构day1】财务系统的领域建模——五视图法的分析
- Counting Liars