php怎么实现简单的mvc框架,php实现简单的MVC框架实例

这篇文章主要介绍了php实现简单的MVC框架,较为详细的分析了php实现MVC框架的相关实现技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php实现简单的MVC框架。分享给大家供大家参考。具体如下:

在开始之前需要知道的知识

1.php基础知识

2.单一入口, 不知道的可以看看这里 ()

具备以上两点, 那我们就可以开始啦. 哈哈!

先来说一下程序的执行流程

首先有个入口文件, 然后初始化一些程序, 之后根据请求调用不同的类和方法

首先我们弄一个入口文件 Index.php 来看看代码

require "Init.php";

$control = new Controller();

$control->Run();

?>

代码没什么特别的, 首先先引入Init.php文件 然后实例化一个类

然后调用该类的Run()方法 这里我们把这个类叫做控制器

既然引入了Init.php文件, 那么我们继续看看Init.php文件的源码

header("Content-type:text/html;charset=utf-8");

!defined('ROOT_PATH') && define('ROOT_PATH', str_replace('\\', 'http://www.jb51.net/', dirname(__FILE__)));

require ROOT_PATH . '/Core/Config.php'; //引入配置文件

require ROOT_PATH . '/Core/Controller.class.php'; //引入控制器类文件

require ROOT_PATH . '/Core/View.class.php'; //视图类文件

require ROOT_PATH . '/Core/Model.class.php'; //模型类文件

?>

分析一下代码, 如果你懂了, 可以略过这一步, 继续往下看哦.

首先 设置字符集, 然后判断如果没有定义常量"ROOT_PATH"那么就定义它

然后就是引入一些文件, 首先是配置文件, 控制器类文件, 视图类文件, 模型类文件

同理既然引入了文件,那么我们就打开文件看看代码, 先来看Config.php文件

$C = array(

'URL_MODE' => 1, //URL模式, 1普通模式, 2 PATH_INFO模式

'DEFAULT_CONTROL' => 'welcome', //默认调用的控制器

'DEFAULT_ACTION' => 'index', //默认执行的方法

);

?>

没什么特别的就是一个数组, 有三个值, 暂时先这样, 以后有需要在来增加

那么好, 我们继续看Controll.class.php

class Controller

{

public function Run()

{

$this->Analysis(); //开始解析URL获得请求的控制器和方法

$control = $_GET['c'];

$action = $_GET['a'];

//这里构造出控制器文件的路径

$controlFile = ROOT_PATH . '/Controllers/' . $control . '.class.php';

if(!file_exists($controlFile)) //如果文件不存在提示错误, 否则引入

{

exit('控制器不存在' . $controlFile);

}

include($controlFile);

$class = ucwords($control); //将控制器名称中的每个单词首字母大写,来当作控制器的类名

if(!class_exists($class)) //判断类是否存在, 如果不存在提示错误

{

exit('为定义的控制器类' . $class);

}

$instance = new $class(); //否则创建实例

if(!method_exists($instance, $action)) //判断实例$instance中是否存在$action方法, 不存在则提示错误

{

exit('不存在的方法' . $action);

}

$instance->$action();

}

protected function Analysis()

{

global $C; //包含全局配置数组, 这个数组是在Config.ph文件中定义的

if($C['URL_MODE'] == 1) //如果URL模式为1 那么就在GET中获取控制器, 也就是说url地址是这种的?c=控制器&a=方法

{

$control = !empty($_GET['c']) ? trim($_GET['c']) : '';

$action = !empty($_GET['a']) ? trim($_GET['a']) : '';

}

else if($C['URL_MODE'] == 2) //如果为2 那么就是使用PATH_INFO模式, 也就是url地址是这样的 控制器/方法/其他参数

{

if(isset($_SERVER['PATH_INFO']))

{

//$_SERVER['PATH_INFO']URL地址中文件名后的路径信息, 不好理解, 来看看例子

//比如你现在的URL是 那么你的$_SERVER['PATH_INFO']就是空的

//但是如果URL是

//现在的$_SERVER['PATH_INFO']的值将会是 index.php文件名称后的内容 /abc/123/

$path = trim($_SERVER['PATH_INFO'], 'http://www.jb51.net/');

$paths = explode('http://www.jb51.net/', $path);

$control = array_shift($paths);

$action = array_shift($paths);

}

}

//这里判断控制器的值是否为空, 如果是空的使用默认的

$_GET['c'] = $control = !empty($control) ? $control : $C['DEFAULT_CONTROL'];

//和上面一样

$_GET['a'] = $action = !empty($action) ? $action : $C['DEFAULT_ACTION'];

}

}

?>

注释写的很清楚, 这里我就不多说了, 做到这, 你就可以建立一个Controller目录, 然后在目录中建立welcome.class.php文件

写入如下内容

class Welcome

{

public function index()

{

echo 'Hello';

}

}

?>

允许程序你将会看到Hello

然后在写一个方法

class Welcome

{

public function index()

{

echo 'Hello';

}

public function show()

{

echo '方法名称Show';

}

}

?>

希望本文所述对大家的php程序设计有所帮助。

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

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

相关文章

演化树,靠不住?挑战物种出现与灭绝速率的估算方法

来源:Nature自然科研原文作者:Mark Pagel以演化树形式绘制的图表能够显示物种之间的系统发育关系,这类图表被广泛用于估算新物种出现以及现存物种灭绝的速率,但一项新的研究对这种方法提出了质疑。科学家经常试图对生物的过去是什…

Windows中使用wget整站下载

weget wget安装 Windows下载 点击下载 https://eternallybored.org/misc/wget/会跳转到wget的下载页,根据自己电脑选择下载的文件,我下载的版本为wget-1.19.1-win64.zip下载完成后解压文件,并且双击exe使用wget wget使用 在需要下载到网站的位置新建文…

java中事件的概念,事件中心上IoTHub数据的概念

我是IoTHub的新手 . 我有一个关于数据如何发送到IoTHub \ EventHub的基本查询 . 从我的阅读中我看到 - 和 IoT Hub and Event Hub - 作为不同的实体 .My Requirement我需要开发一个可以将数据从Raspberry Pi3设备发送到IoT Hub的应用程序另一个Web应用程序,用于订阅…

Android媒体解码MediaCodec,MediaExtractor

Android提供了MediaPlayer播放器播放媒体文件&#xff0c;其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装&#xff0c;方便使用。但是最好理解下Android媒体文件的解码&#xff0c;编码和渲染流程。 Shape Of My Heart.mp4 <source src"…

2020五大技术趋势一览!超自动化、人类增强技术、无人驾驶发展、机器视觉崛起、区块链实用化...

文章原载于 RichardLiu自动驾驶技术的发展近年来&#xff0c;自动驾驶技术一直在发展&#xff0c;特斯拉、英特尔等大公司在这一领域取得了长足的进展。虽然我们还没有达到L4级或L5级自动驾驶汽车的水平&#xff0c;但我们已经很接近了。为了解释每个级别的含义&#xff0c;下…

ansible执行mysql命令,Ansible常用命令(ad-hoc 命令)

Ansible提供两种方式去完成任务&#xff1a;1、ad-hoc命令2、写Ansible playbook脚本前者可以解决一些简单的任务&#xff0c;后者解决较复杂的任务(ad-hoc命令和ansible playbook的关系类似于在命令行敲入shell命令和写shell scripts两者之间的关系)。ansible命令应用基础语法…

Facebook 开源聊天机器人Blender,经94 亿个参数强化训练,更具“人情味”

来源&#xff1a;AI前线作者 | Kyle Wiggers编译 | Sambodhi策划 & 编辑 | 刘燕不久前&#xff0c;Facebook 开源了号称是全球最强大的聊天机器人 Blender&#xff0c;它标志着 Facebook 在 AI 领域的新进展&#xff1a;新的聊天机器人不仅解决了此前聊天机器人的固有缺点&…

微服务go还是java,Java微服务 vs Go微服务,究竟谁更强!?

前言Java微服务能像Go微服务一样快吗&#xff1f;这是我最近一直在思索地一个问题。去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上&#xff0c;Mark Nelson和Peter Nagy就对此做过一系列基础的的测试用以比较。接下来就给大家介绍下。在程序员圈子里&#xff0c…

php类中双冒号和-的区别

就是为了区分对象的方法和属性&#xff0c;和是访问类的静态方法和静态变量&#xff0c;类的静态方法和静态变量是类公用的&#xff0c;不需要实例化也能访问&#xff0c;而对象的方法和属性是每个对象特有的&#xff0c;因此必须先实例化。其他语言如C,JAVA等也是一样的&#…

java用循环语法在窗体中显示文字,如果子窗体在窗体视图中,则访问2003循环当前页面不起作用...

我有一个包含多个子表单的表单 .我想有以下行为&#xff1a;按主窗体的最后一个字段中的tab键或子窗体的最后一个字段中焦点移动到下一个子窗体或根据定义的Tab顺序返回到主窗体 .为此&#xff0c;所有子表单和主表单都将Cycle属性设置为Current页面 .除了表单视图中显示的子表…

Defi安全-Mono攻击事件分析--etherscan+phalcon

MonoX攻击事件相关信息 在Ethereum和Polygon网络都发生了&#xff0c;攻击手段相同&#xff0c;以Ethereum为例进行分析&#xff1a; 攻击者地址&#xff1a;MonoX Finance Exploiter | Address 0xecbe385f78041895c311070f344b55bfaa953258 | Etherscan 攻击合约&#xff1a…

特斯拉自动驾驶靠自研芯片,国产智能汽车怎么办?

文章来源&#xff1a;量子位从这个月开始&#xff0c;特斯拉终于跌破30万&#xff0c;进入补贴行列&#xff0c;与国产汽车展开正面竞争。在国产汽车和特斯拉之间该如何选择&#xff0c;除了续航里程外&#xff0c;最重要的可能就是智能驾驶系统了。智能驾驶系统该怎么比较&…

Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

链接&#xff1a; http://codeforces.com/contest/462/problem/D 题意&#xff1a; 给定n个点的树&#xff0c; 0为根&#xff0c;下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色&#xff0c;0为白色&#xff0c;1为黑色。 把树分成若干个联通块使得每个联通块有…

【星·企业】竞逐卫星互联网“新基建”,「九天微星」完成2.7亿元B 轮融资

图为九天微星一箭七星“瓢虫系列”主星示意图来源&#xff1a;中科创星据了解&#xff0c;「九天微星」将用此轮融资在河北唐山和四川宜宾分别建设互联网卫星平台、载荷自动化产线&#xff0c;同时强化宽带通信系统研发能力&#xff0c;加速地面终端产品投产。九天微星卫星工厂…

java kafka搭建,Apache Kafka 安装步骤

概览安装过程总共分为 3 大块&#xff0c;第一 Java 环境不必多说&#xff0c;第二 Zookeeper 安装&#xff0c;第三 Kafka 安装。概念了解Kafka 有几个重要的概念需要先了解一下名词解释broker可以理解为 Kafka 所在的服务器ZooKeeper分布式服务框架在 Kafka 中的作用主要负责…

Java的for-each循环

for (循环变量类型 循环变量名称 : 要被遍历的对象) 例&#xff1a; for (String string:str) for(int i0;i<str.size();i){   String string str[i];} 上面代码简单点来描述就是把str里的内容依次遍历给string转载于:https://www.cnblogs.com/CYG7/p/7289497.html

3D原子映射有助于研究生命的起源

Chi Ma/Royal Ontario Museum来源&#xff1a;IEEE电气电子工程师一种相对较新的研究原子的技术可能会对地球上生命的起源提供更多的线索。科学家利用三维原子图&#xff08;特别是原子探针层析成像&#xff09;发现&#xff0c;太阳系中最古老的分子流体本可以支持氨基酸的发展…

java7 uri,细数Java8中那些让人纵享丝滑的文件操作

在丑陋的 Java I/O 编程方式诞生多年以后&#xff0c;Java终于简化了文件读写的基本操作。打开并读取文件对于大多数编程语言来是非常常用的&#xff0c;由于 I/O 糟糕的设计以至于很少有人能够在不依赖其他参考代码的情况下完成打开文件的操作。在 Java7 中对此引入了巨大的改…

混合现实未来的八大应用场景

来源&#xff1a;诚迈科技近日&#xff0c;福布斯发布了一篇关于混合现实未来的八个值得关注的领域和应用场景。文中提到&#xff1a;随着时间的推移&#xff0c;技术永远在不断进展&#xff0c;而未来技术中很可能是AR和VR的结合形式。有报告显示&#xff1a;2024年&#xff0…

也来分析为什么支付宝要做社交

也来分析为什么支付宝要做社交 近期。身边的同事和朋友似乎对使用支付宝有点“走火入魔”了。常常有人在支付宝里面请求加我为好友。大家在食堂吃饭的时候也在讨论今天加了谁谁谁为好友。一问才知道。原来假设加入好友达到一定的数量&#xff0c;将有机会在春节期间抢支付宝发出…