php好的mvc中index方法,创建一个mvc应用目录架构并创建入口文件index.php
摘要:<?php
require 'vendor/autoload.php';
require 'pig/Base.php';
define('ROOT_PATH',__DIR__.'/');
$config=require 'pig/config.php';
$queryStr=$_S
<?php
require 'vendor/autoload.php';
require 'pig/Base.php';
define('ROOT_PATH',__DIR__.'/');
$config=require 'pig/config.php';
$queryStr=$_SERVER['REQUEST_URI'];
(new \pig\Base($config,$queryStr))->run();
框架入口文件 index.php 打开执行后实例化框架基础类的调试状态,自动加载类文件如:当用户提供:php.edu/demo/index/a 后框架自动加载检测准备new的类生成绝对路径.
D:\myphp_www\PHPTutorial\WWW\php.edu/pig/Route.php
D:\myphp_www\PHPTutorial\WWW\php.edu/app/admin/controller/Index.php
/**
* * 框架基础类
* 1. 调试模式
* 2. 自动加载
* 3. 启动框架
*/
namespace pig;
class Base
{
protected $config=[];
protected $queryStr='';
public function __construct($config,$queryStr)
{
$this->config=$config;
$this->queryStr=$queryStr;
}
public function setDebug()
{
if($this->config['app']['debug']){
error_reporting(E_ALL);
ini_set('display_errors','On');
}else{
error_reporting(E_ALL);
ini_set('display_errors','off');
ini_set('log_errors','On');
}
}
public function loader($class)
{
$path = ROOT_PATH.str_replace('\\','/',$class).'.php';
echo $path.'
';
if (!file_exists($path)){
header('Location:/');
}
require $path;
}
public function run()
{
$this->setDebug();
spl_autoload_register([$this,'loader']);
echo(new Route($this->config['route']))->parse($this->queryStr)->dispatch();
}
}<?php
/**
*路由、分发类
*/
namespace pig;
class Route
{
// protected $route = [];
public $route = [];
// protected $pathInfo=[];
public $pathInfo=[];
// protected $params=[];
public $params=[];
public function __construct($route)
{
$this->route=$route;
}
public function parse($queryStr='')
{
$queryStr=trim(strtolower($queryStr),'/');
$queryArr=explode('/',$queryStr);
$queryArr=array_filter($queryArr);
switch (count($queryArr))
{
case 0:
$this->pathInfo =$this->route;
break;
case 1:
$this->pathInfo['module']=$queryArr[0];
break;
case 2:
$this->pathInfo['module']=$queryArr[0];
$this->pathInfo['controller']=$queryArr[1];
break;
case 3:
$this->pathInfo['module']=$queryArr[0];
$this->pathInfo['controller']=$queryArr[1];
$this->pathInfo['action']=$queryArr[2];
break;
default:
$this->pathInfo['module']=$queryArr[0];
$this->pathInfo['controller']=$queryArr[1];
$this->pathInfo['action']=$queryArr[2];
$arr=array_slice($queryArr,3);
for ($i=0;$i
if (isset($arr[$i+1])){
$this->params[$arr[$i]]=$arr[$i+1];
}
}
break;
}
return $this;
}
public function dispatch()
{
$module=$this->pathInfo['module'];
$controller='\app\\'.$module.'\controller\\'.$this->pathInfo['controller'];
$action = $this->pathInfo['action'];
// new $controller;
if(!method_exists($controller,$action)){
$action=$this->route['action'];
header('Location:/');
}
return call_user_func_array([new $controller,$action],$this->params);
}
}<?php
/**
* Created by PhpStorm.
* User: 普通用户
* Date: 2019/5/13
*
*/
namespace app\demo\controller;
class index
{
public function a()
{
echo "demo->index->a";
}
}
批改老师:天蓬老师批改时间:2019-05-13 09:17:42
老师总结:通过这个小框架 , 相信你对一个php框架的运行的基本流程有了一个大致的了解...
一个真实商用的php框架, 它的复杂度远高于这个教学框架, 但是底层的原理与架构, 与这个并无本质区别..
掌握 这个小框架的编程思想和思维模式, 对于你以后学习成熟的框架开发, 如laravel, thinkphp,ci, yii等, 非常有好处的, 加油...
相关文章:

C语言对mysql数据库的操作
C语言对mysql数据库的操作 原文:C语言对mysql数据库的操作这已经是一相当老的话题。不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正传…

[转]MCC(移动国家码)和 MNC(移动网络码)
From : http://blog.chinaunix.net/uid-20484604-id-1941290.html 国际移动用户识别码(IMSI) international mobile subscriber identity 国际上为唯一识别一个移动用户所分配的号码。 从技术上讲,IMSI可以彻底解决国际漫游问题。但是由于…

虚拟机cenos 重置密码
许久不用虚拟机,临时想登录看下,结果想不起来密码了,尝试各种可能的密码都登录失败。然后百度查验各种方法,看到一篇文章然后根据上面说的成功解决了问题,贴出链接:https://blog.csdn.net/dannistang/artic…

g-git 相关命令 及其 基本原理探索 (一)
文章目录git 最小配置作用域git 创建本地仓库git log 查看版本演进.git 目录refs目录objectsgit 三种对象类型详解 (commit ,tree,blob)因为工作需求,接下来将从git的使用到其内部工作原理,来避免代码提交或者review或者版本管理上的一些尴尬,…

php表单退出怎么写,PHP提交表单失败后如何保留填写的信息
[导读]本文章来给各位同学介绍PHP提交表单失败后如何保留填写的信息一些方法总结,最常用的就是使用缓存方式了,这种方法如果网速慢是可能出问题的,最好的办法就是使用ajax了。1.使用header头设置缓存控制头Cache-c本文章来给各位同…

lists,tuples and sets of Python
(python2.7.x) Lists 列表 列表是一个有序序列(集合),可变的(可以修改),可以理解为其他语言中的数组类型,但是列表更灵活更强大。 列表由方括号[]来定义的,它的元素可以是任意类型或对象,一个列…

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令
WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是服务器系统会用到的一种组件。shell 就是“壳”的意思,这个对象可以执行操作系统外壳常用…

控件绘制的方法
1处理WM_PAINT 最极端的选择是执行一个 WM_PAINT 处理程序,并且自己完成所有的绘制。这意味着,您的代码将需要进行一些与呈现控件相关的琐事 — 创建适当的设备上下文(一个或多个),决定控件的大小和位置,绘…

google gflags的参数解析,便捷实用
命令行参数解析,一直是我们后段开发人员需要经常使用的一个功能,用来从终端解析接口的输入 ,并做出对应的处理。这里为使用C/python的开发人员推荐一个便捷的命令行解析接口集 gflags。 我们之前使用C的getopt/getopt_long 函数需要自己使用…

linux进程下的线程数,Linux下查看进程线程数的方法
0x01:ps -ef只打印进程,而ps -eLf会打印所有的线程[rootcentos6 ~]# ps -ef | grep rsyslogdroot 1470 1 0 2011 ? 00:01:13 /sbin/rsyslogd -c 4root 29865 28596 0 22:45 pts/5 00:00:00 grep rsyslogd[rootcentos6 ~]# ps…

OpenCV学习(20) grabcut分割算法
在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好。算法的原理参见papaer:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts 比如下面的一…

VMware workstation中rhel安装VMware tools失败
切换登录用户为root即可转载于:https://www.cnblogs.com/dazzleC/p/10555809.html

g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!
上一篇git 基本原理对git的使用以及文件分布已经有了一个整体的了解。 本篇将对工作中常用的一些git 操作命令的操作进行总结归纳,方便今后查阅。 文章目录1. 分离头指针2. 通过HEAD 来进行不同提交的差异对比3. 删除不需要的分支4. 对当前分支最近一次提交的messag…

Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换
题目描述:编写一个函数实现Linux文件寻址的算法,即读取文件当前位置到物理存储位置的转换函数,需要给出运行的测试数据,可以假设和模拟需要的数据和结构。即编写一个函数unsigned long ltop(unsigned long logblkNum). 计算逻辑块…

datatable和dataset的区别
DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表。插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库,DataTable是一个内存中的数据表,DataSet里可以存储多个DataTabledatatable是dataset中的一个表另…

如何避免重构带来的危险
http://blog.jobbole.com/30049/ 重构代码很危险,它会给测试工作增加巨大的负担。除非你的程序需要重构,一定不要轻易重构代码。我这里所说的并不是把一个for循环改成while循环,或把一个StringBuffer改成StringBuilder,我说的是大…

ip通信(第二周)
计算机网络分为局域网(LAN)、城域网(MAN)和广域网(WAN)。拓扑结构分为星型网,树形网,分布式网络,总线型网络,环型网络和复合型网络。认识了几个常见的国际标准…

《DDIA》读书笔记
数据存储系统的经典书籍: 从数据系统的特性开始,先讲单机存储引擎 再到 分布式存储系统,最后到一些数据流的处理方式,作者深入浅出,译者更是精雕细琢,本书需要细品。 将持续阅读整理,先从理论走…

linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网
前段时间下载了红帽的linux,版本为redhat 9.0,整整刻了三张CD。最初是为了体验一下linux下QQ聊天软件的功能,最后因内核太低(官方推荐内核在2.6以上,我下载的版本是2.4)而告终。最大的收获是了解了linux下文件系统及linux下软件与…

安卓天天酷跑脚本刷高分图文教程
http://news.gamedog.cn/a/20130923/241742.html

SpringBoot 中 JPA 的使用
前言 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。 新建项目,增加依赖 在 Intellij IDEA 里面新建一个…

《DDIA》读书笔记(一):可靠性、可扩展性、可维护性
这一节描述了密集型应用的基本思考方式。 可靠性。意味着系统发生故障,也能保持正常的运行。故障会集中在三个方面,硬件故障(通常是随机和不相关的)、软件故障(通常是系统性的bug,较难发现,较难处理),人为故障(不可避免得时不时出…

TCP协议-TCP连接管理
TCP协议是 TCP/IP 协议族中一个非常重要的协议。它是一种面向连接、提供可靠服务、面向字节流的传输层通信协议。TCP(Transmission Control Protocol,传输控制协议)。

[Unity WWW] 跨域访问解决方法
什么是跨域访问 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配…

linux环境安全测评实验报告,linux第一次实验报告
iframe载入页面过程显示动画效果http://www.xfeixiang.com/Bug/Detail/A2FD7EFFA8CA72F1加密算法使用(三):用用BASE64采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到 package testEncrypt; import java.security.Key; import java.secu ...jav…

2019-03-20 Python爬取需要登录的有验证码的网站
当你向验证码发起请求的时候,就有session了,记录下这次session因为每当你请求一次验证码 或者 请求一次登录首页,验证码都在变动验证码的链接可能不是固定的,可能需要GET/POST请求,获取那部分变动的信息 session requests.sessio…

Mac上 如何快速玩起rocksdb
想要自己随时随地写一写rocksdb的代码,并且快速测试,但是公司的物理机登陆过于麻烦,想要验证功能的话其实在自己的电脑就完全可以了。 安装 brew install rocksdb,默认二进制文件安装在/usr/local/bin在~/.bashrc或者自己正在使用…

OC学习篇之---对象的拷贝
在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语…

linux脚本自定义赋值,JMeter——运用BeanShell给自定义的变量动态赋值
这个计划中定义了以下组件:用户自定义变量:里面定义了2个变量,一个是us(注意,未对它初始化),一个变量名是:test ,值为:123456一个BeanShell Sampler:${test}表示传入BeanShell Sampl…

VS2010与Qt设置出现红线提示
任何类库导入都有可能出现红线,主要原因是“包含目录没有设置”点击“项目”-> (你的项目)属性->配置属性->VC目录->包含目录 把你的目录写入(我的是:H:\Qt\4.8.5\include)点击确定~ 完成。转载…