我们常见的访问约定方式一:/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) --异形相关推荐

  1. 沈逸老师PHP魔鬼特训笔记(3)

    一.由于上两节课我们把程序放到了/usr/local/bin里面.每次编辑需要sudo .这节课我们使用PHPSTORM来编辑代码,专门把它拷贝出来,然后放到一个叫做home/godpro的文件夹下. ...

  2. 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展...

    1.编译安装apache2.4.20 1 第一步: ./configure --prefix=/usr/local/httpd --enable-so 2 第二步: make 3 第三步: sudo ...

  3. OSS报表系统实训笔记

    OSS报表系统 实训笔记 实训公司:中科天地 (王海格,老师超好)                                     Edited by Hen Egg ,Michelangel ...

  4. 【研究报告】从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期)

    从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期) 报告总结 & 相关论文 论文代码 相关术语 前言 研究问题 单目深度估计 单目三维场景重建 ...

  5. 沈逸康人物介绍沈逸康ABI-company创办人

    沈逸康 人物介绍:沈逸康,ABIcompany创办人 中文名 :沈逸康 外文名 :SamShen 别 名 : 沈逸 国 籍 :中国 民 族 :汉 出生地 :湖北黄冈 出生日期 :19950829 职 ...

  6. 轻微课魔鬼特训班学员自述零基础学画画蜕变之路

    学画画之路到底有多难?没有真正经历过的小白永远也不会有深刻的体会,但是自从遇到了轻微课,我的学画之路似乎变得更有动力和成就感. 轻微课是我学画道路上的第一位老师,也是我入门绘圈的引路人,在轻微课我接受 ...

  7. css+js+jq实训笔记

    css+js+jq实训笔记 css第一天 css第二天 css第三天 css第四天 css第五天 css第六天 js第一天 js第二天 js第三天 js第四天 js第五天 js第六天 jq第一天 jq ...

  8. 大数据实训笔记10:hive的应用

    目录 数据定义 数据仓库操作 数据仓库的创建 数据仓库的查询 数据仓库的修改 数据仓库的删除 表操作 内部表 外部表 分区表 桶表 表的修改 表的删除 视图 数据操作 数据导入 加载数据 插入数据 数 ...

  9. 专访沈逸:技术,不存在有前途没前途之分

    沈逸认为,初级或中级程序员不要想太多,把自己产品做好.人脉积累广阔和基础打好,想要的东西顺其自然就会来. 沈逸,毕业于江苏常州工学院,经济管理学出身,<失业的程序员>真实创业经历文章作者. ...

最新文章

  1. Redis安装与调试
  2. java约瑟夫环 循环链表_约瑟夫环_循环链表JAVA解答
  3. GLPI生成中文PDF报表
  4. 计算机二级c语言109套,2016年9月计算机二级C语言操作题109套讲述.docx
  5. 亚马逊记AWS(Amazon Web Services)自由EC2应用
  6. boost::hana::id用法的测试程序
  7. 基于蒙特卡罗模拟的金融风险评估-函数调用关系图
  8. EditPlus 技巧大全:[1]怎么配置PHP编译环境
  9. 右键计算机无法进入管理员权限,电脑鼠标右键怎么添加取得管理员权限选项
  10. python 画三角函数_用Python计算三角函数之acos()方法的使用
  11. Day005 20210218-20210221
  12. Altova XMLspy安装简易步骤
  13. PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱
  14. 微信html5 下拉刷新,微信小程序下拉刷新:onPullDownRefresh正确使用姿势
  15. win10安装visio2010出错_Office2010安装过程中提示错误1907的三种解决方法
  16. Leco题目:寻找两个正序数组的中位数
  17. 企业上云成趋势 看超融合如何开箱即用、一步上云
  18. IOS UILabel 多行文字自动换行
  19. 【财务架构day1】财务系统的领域建模——五视图法的分析
  20. Counting Liars

热门文章

  1. 如何快速实现自动抢红包?
  2. java变量的两种类型
  3. java的数据类型有哪些_Java的变量的数据类型有哪些
  4. android 6 videoview,android VideoView播放视频-source
  5. 树莓派gpio编程c语言,树莓派gpio编程(一)控制Led灯
  6. hprof是什么文件?可以删除吗
  7. 监督学习VS无监督学习
  8. java 新浪短链接_2020最新的新浪短网址(T.CN短链接)API接口分享
  9. rowhammer继续侵扰,DDR4并非真命天子
  10. 2022年氟化工艺考试模拟100题及答案