PHP MVC框架【Myphp】的编写
<h1>1、什么是MVC</h1><p>MVC(Model-View-Controller)是软件工程的一种软件架构模式。</p>
<p>在MVC模式设计下,软件系统被分来三个模块:模型(Model)、视图(VIew)、控制器(Controller)。</p>
<p>PHP下的MVC模式又称为Web MVC,自上世纪70年代进化而来。</p>
<p>使用MVC模式的目的是:实现一种动态的程序设计,便于后续对程序的修改和拓展,且使得程序的某一部分的重复利用成为可能。</p>
<p>MVC各模块的职能:</p>
<ul>
<li>模型Model:管理大部分的业务逻辑和所有的数据库逻辑。模型抽象简化了连接和操作数据库的操作。</li>
<li>控制器Controller:负责响应用户请求、准备数据,决定如何展示数据。</li>
<li>视图View:负责数据渲染,通过HTML方式呈现给用户。</li>
</ul>
<p><img src="https://img2018.cnblogs.com/blog/1847743/201910/1847743-20191029220425329-373232162.gif"></p>
<p>一个典型的Web MVC 处理流程:</p>
<ol>
<li>Controller接受到用户发来的请求;</li>
<li>Controller调用Model完成对状态的读写操作;</li>
<li>Controller把数据传递给View;</li>
<li>View渲染出HTML页面并展示给用户。</li>
</ol>
<h1>2、为什么要自己开发MVC框架</h1>
<p>为了做以MVC模式开发的各类CMS的代码审计。</p>
<h1>3、准备工作</h1>
<h2>3.1 开发环境准备</h2>
<p>建站软件:phpstudy2018</p>
<p>IDE:phpstorm2018.1</p>
<p>php版本:5.4.45-nts</p>
<p>Apache&MySQL</p>
<h2>3.2 目录准备</h2>
<p>我给该Web MVC框架取名为:MyPhp</p>
<p>该项目目录为:<span style="color: rgba(0, 0, 0, 1)">MyPhpFrame1</span></p>
<p>整个项目的目录结构如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">MyPhpFrame1 web框架部署根目录
├─application 应用目录
│├─controllers 控制器目录
│├─models 模块目录
│└─views 视图目录
├─config 配置文件目录
├─myphp 框架核心目录
├─runtime 运行临时目录
├─</span><span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> 静态文件目录
├─.htaccess Apache目录配置
└─index.php 入口文件</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)">MyPhpFrame1</span>位于Apache站点根目录之下。通过访问 http://localhost/<span style="color: rgba(0, 0, 0, 1)">MyPhpFrame1 ,可以访问到该项目。</span></p>
<h2>3.3 <span id="34">重定向</span></h2>
<p> 3.2展示的目录中<span style="color: rgba(0, 0, 0, 1)">.htaccess文件,是Apache服务器的目录级别的分布式配置文件,可以针对特定目录改变Apache配置。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">.htaccess</span> 可以帮我们实现:重写URL、网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">Apache服务器通过启用AllowOverride All实现对应目录下的配置可重写。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">本框架下.htaccess文件内容为:</span></p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">IfModule </span><span style="color: rgba(255, 0, 0, 1)">mod_rewrite.c</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
#打开Rerite功能
RewriteEngine On
# 如果请求的是真实存在的文件f或目录d,直接访问
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#重定向所有请求到index.php?url=原路径
RewriteRule ^(.*)$ index.php?url=$1
# passthrough,使得RewriteRule的结果重写加入到URL的匹配中
# last,使得mod_rewrite 停止处理规则集
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">IfModule</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>这里使用该.htaccess的原因是:</p>
<p>1、 静态文件可以直接访问,比如css文件、js文件都可以直接访问。</p>
<p>(如果是非index.php的php文件,可以访问,不过由于框架特性,类之间需要extends,可能会报错。如果是目录,也可以访问,如果apache开启了目录列表,则可以看到index of目录,否则返回403。)</p>
<p>2、 程序有了单一的入口,就是index.php。</p>
<p> 当请求地址不是真实存在的文件或目录时,请求就会传给index.php。</p>
<p>例如,访问地址:http://localhost/MyPhpFrame1/item/index,文件系统中并不存在这样的文件或目录。则Apache会把重写这个地址为:http://localhost/MyPhpFrame1/index.php?url=item/index。这样在php中用$_GET['url']就可以拿到 item/index了。</p>
<h2>3.4 <span id="34">代码规范</span></h2>
<p><span>代码规范如下:</span></p>
<ol>
<li><span>MySQL的表名:使用小写字母与下划线(_)命名,如:item、bus_info</span></li>
<li>Model模块名:使用大驼峰法(首字母大写),并在名称后加上Model,如:ItemModel、BusModel</li>
<li>Controller控制器名:使用大驼峰法(首字母大写),并在名称后加上Controller,如:ItemController、BusController</li>
<li>Action方法名:使用小驼峰法(首字母小写),如:index、selectAll</li>
<li>View视图 部署结构为:控制器名/行为名,如:item/index.php、item/manage.php</li>
</ol>
<p>使用代码规范的目的:使得程序能更好地相互调用。</p>
<h1>4、PHP MVC核心框架</h1>
<h2>4.1 入口文件<span id="34"></span></h2>
<p>index.php为整个项目的入口文件,位于项目根目录/下。</p>
<p>文件内容为:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 128, 1)">header</span>("Content-Type: text/html; charset=utf-8"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置返回包编码方式,避免页面乱码
//初始化常量</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('APP_PATH',__DIR__.'/');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">网站根目录</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('CONFIG_PATH',APP_PATH.'config/');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">网站配置目录</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('APP_DEBUG',<span style="color: rgba(0, 0, 255, 1)">false</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开启调试模式</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('APP_URL','http://localhost/MyPhpFrame1/');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">网站URL</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('RUNTIME_PATH',APP_PATH.'runtime/');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">网站临时目录</span><span style="color: rgba(0, 128, 0, 1)">
//加载配置文件</span>
<span style="color: rgba(0, 0, 255, 1)">require</span> CONFIG_PATH.'/config.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加载框架核心文件</span>
<span style="color: rgba(0, 0, 255, 1)">require</span> APP_PATH.'myphp/MyPhp.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实例化框架类,并执行run()方法</span>
<span style="color: rgba(128, 0, 128, 1)">$myphp</span>=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Myphp();
</span><span style="color: rgba(128, 0, 128, 1)">$myphp</span>->run();</pre>
</div>
<p> </p>
<p>可以看到,上面的php代码并没有使用php结束符 ?>。</p>
<p>纯php代码中php结束符是可选的,提倡不写php结束符。如果这个是一个被别人require的php文件,没有这个结束符,可以避免多余输出(也就是?>之后的任何数据,包括空格、换行符等)导致header, setcookie, session_start函数执行的失败(这几个函数执行前,不允许展示任何数据)。</p>
<h2>4.2 配置文件</h2>
<p>config.php是项目的配置文件。位于config/目录下。</p>
<p>config.php的作用是:定义数据库连接参数,配置默认控制器名和默认动作名。</p>
<p>config.php文件内容为:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数据库连接参数</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('DB_NAME','myphpdb'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">define</span>('DB_USER','root'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">define</span>('DB_PASSWORD','root'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">define</span>('DB_HOST','localhost'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">默认控制器名和默认方法名</span>
<span style="color: rgba(0, 128, 128, 1)">define</span>('DEFAULT_CONTROLLER','Item'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">define</span>('DEFAULT_ACTION','index');</pre>
</div>
<h2>4.3 <span id="43">框架核心类</span></h2>
<p>MyPhp.php是MyPhp框架的核心类文件。位于<span style="color: rgba(0, 0, 0, 1)">myphp/目录下。</span></p>
<p> 在入口文件中,对框架类做了两步操作:实例化、调用run()方法。</p>
<p>run()方法调用了框架类自身方法,完成以下操作:</p>
<ol>
<li>类自动重载</li>
<li>环境设置</li>
<li>清理转义字符</li>
<li>移除全局变量</li>
<li>处理路由</li>
</ol>
<p>MyPhp.php文件内容为:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* MyPhp核心框架类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">初始化常量</span>
<span style="color: rgba(0, 128, 128, 1)">defined</span>('APP_PATH') or <span style="color: rgba(0, 128, 128, 1)">define</span>('APP_PATH',__DIR__.'\\'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">defined</span>('APP_URL')or <span style="color: rgba(0, 128, 128, 1)">define</span>('APP_URL','http://localhost/MyPhpFrame1'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">defined</span>('APP_DEBUG') or <span style="color: rgba(0, 128, 128, 1)">define</span>('APP_DEBUG',<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">defined</span>('CONFIG_PATH') or <span style="color: rgba(0, 128, 128, 1)">define</span>('CONFIG_PATH',APP_PATH.'config\\'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">defined</span>('RUNTIME_PATH') or <span style="color: rgba(0, 128, 128, 1)">define</span>('RUNTIME_PATH',APP_PATH.'runtime/'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">defined</span>('DEFAULT_CONTROLLER') or <span style="color: rgba(0, 128, 128, 1)">define</span>('DEFAULT_CONTROLLER','Item'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">defined</span>('DEFAULT_ACTION') or <span style="color: rgba(0, 128, 128, 1)">define</span>('DEFAULT_ACTION','index'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MyPhp
{
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
*运行程序
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> run()
{
spl_autoload_register(</span><span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>,'loadClass'<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">spl_autoload_register — 注册给定的函数作为 __autoload 的实现
//__autoload — 尝试加载未定义的类。当我们实例化一个未定义的类时,就会触发此函数</span>
<span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">setReporting();
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">removeMagicQuotes();
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">unregisterGlobals();
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">Route();
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
*路由处理
*abc.com/controllerName/actionName/queryString
* eg:
* 访问url:localhost/item/show/name/1
* 进入到route方法后,分割url,获得:
* $controller:item
* action:show
* QueryString:array(name,1)
* 然后,实例化一个新控制器:itemController,并调用itemController->show()方法
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Route()
{
</span><span style="color: rgba(128, 0, 128, 1)">$controllerName</span>=<span style="color: rgba(0, 0, 0, 1)">DEFAULT_CONTROLLER;
</span><span style="color: rgba(128, 0, 128, 1)">$actionName</span>=<span style="color: rgba(0, 0, 0, 1)">DEFAULT_ACTION;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['url'<span style="color: rgba(0, 0, 0, 1)">]))
{
</span><span style="color: rgba(128, 0, 128, 1)">$url</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['url'<span style="color: rgba(0, 0, 0, 1)">];//http://localhost/
</span><span style="color: rgba(128, 0, 128, 1)">$urlArray</span>=<span style="color: rgba(0, 128, 128, 1)">explode</span>('/',<span style="color: rgba(128, 0, 128, 1)">$url</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">explode 把字符串打散为数组
//获取控制器名</span>
<span style="color: rgba(128, 0, 128, 1)">$controllerName</span>=<span style="color: rgba(0, 128, 128, 1)">ucfirst</span>(<span style="color: rgba(128, 0, 128, 1)">$urlArray</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ucfirst 首字母转换为大写
//获取动作名</span>
<span style="color: rgba(0, 128, 128, 1)">array_shift</span>(<span style="color: rgba(128, 0, 128, 1)">$urlArray</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">array_shift 删除数组中的第一个元素,并返回被删除元素的值</span>
<span style="color: rgba(128, 0, 128, 1)">$actionName</span>=<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$urlArray</span>)?$<span style="color: rgba(128, 0, 128, 1)">actionName</span>:<span style="color: rgba(128, 0, 128, 1)">$urlArray</span>;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取URL参数</span>
<span style="color: rgba(0, 128, 128, 1)">array_shift</span>(<span style="color: rgba(128, 0, 128, 1)">$urlArray</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$queryString</span>=<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$urlArray</span>)?<span style="color: rgba(0, 0, 255, 1)">array</span>():<span style="color: rgba(128, 0, 128, 1)">$urlArray</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//url</span><span style="color: rgba(0, 128, 0, 1)">数据为空时</span>
<span style="color: rgba(128, 0, 128, 1)">$queryString</span>=<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$queryString</span>)?<span style="color: rgba(0, 0, 255, 1)">array</span>():<span style="color: rgba(128, 0, 128, 1)">$queryString</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断控制器、方法 是否存在</span>
<span style="color: rgba(128, 0, 128, 1)">$controller</span>=<span style="color: rgba(128, 0, 128, 1)">$controllerName</span>.'Controller'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 128, 128, 1)">class_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$controller</span>))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">class_exists — 检查类是否已定义</span>
<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">exit</span>(<span style="color: rgba(128, 0, 128, 1)">$controller</span>.'控制器不存在'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">elseif</span>(!<span style="color: rgba(0, 128, 128, 1)">method_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$controller</span>,<span style="color: rgba(128, 0, 128, 1)">$actionName</span><span style="color: rgba(0, 0, 0, 1)">))
{
</span><span style="color: rgba(0, 0, 255, 1)">exit</span>(<span style="color: rgba(128, 0, 128, 1)">$actionName</span>.'方法不存在'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实例化控制器,因为控制器对象里面
//还会用到控制器名和操作名,所以实
//例化的时候把他们俩的名称也传入。查看Controller基类就明白。</span>
<span style="color: rgba(128, 0, 128, 1)">$dispatch</span>=<span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(128, 0, 128, 1)">$controller</span>(<span style="color: rgba(128, 0, 128, 1)">$controllerName</span>,<span style="color: rgba(128, 0, 128, 1)">$actionName</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">$dispatch保存控制器实例化后的对象,我们就可以调用它的方法,也可以向方法中传入参数
//call_user_func_array 调用回调函数,并把一个数组参数作为回调函数的参数
//以下等同于:$dispatch->$action($queryString)</span>
<span style="color: rgba(0, 128, 128, 1)">call_user_func_array</span>(<span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$dispatch</span>,<span style="color: rgba(128, 0, 128, 1)">$actionName</span>),<span style="color: rgba(128, 0, 128, 1)">$queryString</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* 设置开发环境
* </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> setReporting()
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(APP_DEBUG===<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 128, 128, 1)">error_reporting</span>(<span style="color: rgba(255, 0, 255, 1)">E_ALL</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 报告所有错误</span>
<span style="color: rgba(0, 128, 128, 1)">ini_set</span>('display_errors','On'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ini_set 设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。</span>
}<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">error_reporting</span>(<span style="color: rgba(255, 0, 255, 1)">E_ALL</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">ini_set</span>('display_errors','Off'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">ini_set</span>('log_errors','On'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">ini_set</span>('error_log',RUNTIME_PATH.'logs/error.log'<span style="color: rgba(0, 0, 0, 1)">);
}
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* 删除多余的反斜杠
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> stripSlashesDeep(<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$value</span>=<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>)?<span style="color: rgba(0, 128, 128, 1)">array_map</span>('stripSlashesDeep',<span style="color: rgba(128, 0, 128, 1)">$value</span>):<span style="color: rgba(0, 128, 128, 1)">stripslashes</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 递归调用
// stripslashes — 返回一个去除转义反斜线后的字符串(\' 转换为 ' 等等)。双反斜线(\\)被转换为单个反斜线(\)
//array_map — 为数组的每个元素应用回调函数</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* 检测转义后的字符并清除反斜杠
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> removeMagicQuotes()
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">get_magic_quotes_gpc 获得php配置magic_quotes_gpc的bool值
//如果开启magic_quotes_gpc,则对GET、POST、COOKIE 数据自动运行addslashes()
//addslashes 在预定义字符之前添加反斜杠。预定义字符:单引号',双引号",反斜杠\,NULL
//magic_quotes_gpc特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。所以在5.4版本以后php配置文件是找不到魔术引号的配置信息的
//PHP 5.4之后,get_magic_quotes_gpc统一返回false</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">get_magic_quotes_gpc</span><span style="color: rgba(0, 0, 0, 1)">())
{
</span><span style="color: rgba(128, 0, 128, 1)">$_GET</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->stripSlashesDeep(<span style="color: rgba(128, 0, 128, 1)">$_GET</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$_POST</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->stripSlashesDeep(<span style="color: rgba(128, 0, 128, 1)">$_POST</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$_COOKIE</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->stripSlashesDeep(<span style="color: rgba(128, 0, 128, 1)">$_COOKIE</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$_SESSION</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->stripSlashesDeep(<span style="color: rgba(128, 0, 128, 1)">$_SESSION</span><span style="color: rgba(0, 0, 0, 1)">);
}
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* 检测自定义全局变量(register globals)并移除,模拟register_globals=Off
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> unregisterGlobals()
{
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* register_globals的意思就是注册为全局变量,5.4之后已被弃用。当register_globals=On时,
* 局部变量的在脚本的全局域也可用(eg:$_GET['a']也将以$a的形式存在)
* 这样写是不好的实现,会影响代码中的其他变量
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">ini_get</span>('register_globals'<span style="color: rgba(0, 0, 0, 1)">))
{
</span><span style="color: rgba(128, 0, 128, 1)">$array</span>=<span style="color: rgba(0, 0, 255, 1)">array</span>('_SESSION','_POST','_GET','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$array</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>[<span style="color: rgba(128, 0, 128, 1)">$value</span>]<span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span>=><span style="color: rgba(128, 0, 128, 1)">$var</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">处理每个内置数组中每个键值对</span>
<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$var</span>===<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>[<span style="color: rgba(128, 0, 128, 1)">$key</span>]){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果变量值等于全局变量中对应同名的变量值</span>
<span style="color: rgba(0, 0, 255, 1)">unset</span>(<span style="color: rgba(128, 0, 128, 1)">$GLOBALS</span>[<span style="color: rgba(128, 0, 128, 1)">$key</span>]);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">销毁对应的全局变量</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}
}
}
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
* 自动加载控制器和模型类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> loadClass(<span style="color: rgba(128, 0, 128, 1)">$class</span><span style="color: rgba(0, 0, 0, 1)">)
{
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> '执行loadClass('.<span style="color: rgba(128, 0, 128, 1)">$class</span>.')<br />'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$frameworks</span>=__DIR__ . '\\'.<span style="color: rgba(128, 0, 128, 1)">$class</span>.'.class.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$controllers</span>=APP_PATH.'application\\controllers\\'.<span style="color: rgba(128, 0, 128, 1)">$class</span>.'.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$models</span>=APP_PATH.'application\\models\\'.<span style="color: rgba(128, 0, 128, 1)">$class</span>.'.php'<span style="color: rgba(0, 0, 0, 1)">;
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$frameworks</span>.'<br/>'<span style="color: rgba(0, 0, 0, 1)">;
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$controllers</span>.'<br/>'<span style="color: rgba(0, 0, 0, 1)">;
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$models</span>.'<br/>'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$frameworks</span><span style="color: rgba(0, 0, 0, 1)">)){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加载核心框架类</span>
//<span style="color: rgba(0, 0, 255, 1)">echo</span> '开始加载 框架核心类:'.<span style="color: rgba(128, 0, 128, 1)">$frameworks</span>.'<br />'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">include</span> <span style="color: rgba(128, 0, 128, 1)">$frameworks</span><span style="color: rgba(0, 0, 0, 1)">;
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> '成功加载 框架核心类:'.<span style="color: rgba(128, 0, 128, 1)">$frameworks</span>.'<br />'<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$controllers</span><span style="color: rgba(0, 0, 0, 1)">))
{
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> '开始加载 应用控制器类:'.<span style="color: rgba(128, 0, 128, 1)">$controllers</span>.'<br />'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加载应用控制器类else</span>
<span style="color: rgba(0, 0, 255, 1)">include</span> <span style="color: rgba(128, 0, 128, 1)">$controllers</span><span style="color: rgba(0, 0, 0, 1)">;
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> '成功加载 应用控制器类:'.<span style="color: rgba(128, 0, 128, 1)">$controllers</span>.'<br />'<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$models</span><span style="color: rgba(0, 0, 0, 1)">))
{
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> '开始加载 应用模型类:'.<span style="color: rgba(128, 0, 128, 1)">$models</span>.'<br />'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加载应用模型类</span>
<span style="color: rgba(0, 0, 255, 1)">include</span> <span style="color: rgba(128, 0, 128, 1)">$models</span><span style="color: rgba(0, 0, 0, 1)">;
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> '成功加载 应用模型类:'.<span style="color: rgba(128, 0, 128, 1)">$models</span>.'<br />'<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加载失败代码</span>
<span style="color: rgba(0, 0, 255, 1)">exit</span>('加载核心类文件失败!'<span style="color: rgba(0, 0, 0, 1)">);
}
//</span><span style="color: rgba(0, 0, 255, 1)">echo</span> 'loadClass('.<span style="color: rgba(128, 0, 128, 1)">$class</span>.')结束<br />'<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<p>讲解2个方法:loadClass()、route()</p>
<p><strong>localClass()</strong>作用是:加载未定义的类时,导入对应的类文件。</p>
<p>首先构造对应类的可能的文件路径:如果对应类是核心框架类,则类文件路径应该为$frameworks;如果对应类是应用控制器类,则类文件路径应该为$controllers;如果对应类是应用模型类,则类文件路径应该为$models。</p>
<p>接着,对每个可能存在类文件路径,进行<span>file_exists</span>判定,存在则include。</p>
<p>则无本框架下任意类都可以完成自动加载。</p>
<p><strong> route()</strong>作用是:通过url,解析出控制器名、方法名和url参数,然后实例化对应的控制器,执行对应的方法,并传入对应的url参数。</p>
<p>假设浏览器访问的URL为:yourhost.com<span class="hljs-regexp">/<span class="hljs-regexp">controllerName/actionName/queryString</span></span></p>
<p><span class="hljs-regexp">首先,Apache会根据.htaccess重写URL,重写后的URL为:yourhost.com/index.php?url=<span class="hljs-regexp">controllerName/actionName/queryString</span></span></p>
<p><span class="hljs-regexp"><span class="hljs-regexp">route()从全局变量$_GET['url']中获得字符串 <span class="hljs-regexp"><span class="hljs-regexp">controllerName/actionName/queryString</span></span></span></span></p>
<p><span class="hljs-regexp"><span class="hljs-regexp">然后,route()会将字符串转换为数组,通过对数组的操作获得3部分:<span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">controllerName</span></span></span></span>、<span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">actionName、<span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">queryString。</span></span></span></span></span></span></span></span></span></span></p>
<p><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">最后,<strong>route()会实例化对应控制器,并调用对应方法</strong>。</span></span></span></span></span></span></span></span></span></span></p>
<p><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">例如,URL链接为:<span class="hljs-regexp"><span class="hljs-regexp">yourhost.com/item/manage/6,经过route()处理后: </span></span></span></span></span></span></span></span></p>
<ul>
<li><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">$controllerName为:Item</span></span></span></span></span></span></span></span></li>
<li><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">$actionName为:manage </span></span></span></span></span></span></span></span></li>
<li><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">$urlArray为:array(6)</span></span></span></span></span></span></span></span></li>
</ul>
<p> 处理完成后,route()会实例化控制器ItemController,并调用它的manage(<span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">array(6)</span></span></span></span></span></span></span></span>)</p>
<h2>4.4 控制器<span id="43">Controller基类<br></span></h2>
<p><span>接下来,就是在myphp框架中创建MVC基类,包括控制器、模型、视图三个基类。</span></p>
<p><span>在myphp/目录下,新建一个控制器基类,文件名为Controller.class.php,主要功能就是对整个程序进行调度,文件内容为:</span></p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 控制器基类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Controller
{
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_controller</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">控制器名</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_action</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">动作名</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_view</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">视图对象
//构造函数:初始化属性,并实例化对应视图模型</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> __construct(<span style="color: rgba(128, 0, 128, 1)">$controller</span>,<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_controller=<span style="color: rgba(128, 0, 128, 1)">$controller</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_action=<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_view=<span style="color: rgba(0, 0, 255, 1)">new</span> View(<span style="color: rgba(128, 0, 128, 1)">$controller</span>,<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">分配变量
//Controller 类用assign()方法实现把变量保存到View对象中。
//这样,应用Controller调用父类<span style="color: rgba(0, 128, 0, 1)">Controller</span>的 $this->render()后,视图文件就可以显示这些变量。</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> assign(<span style="color: rgba(128, 0, 128, 1)">$name</span>,<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_view->assign(<span style="color: rgba(128, 0, 128, 1)">$name</span>,<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">渲染视图</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> render()
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO: Implement __destruct() method.</span>
<span style="color: rgba(128, 0, 128, 1)">$this</span>->_view-><span style="color: rgba(0, 0, 0, 1)">render();
}
}</span></pre>
</div>
<p>Controller类通过 assign()方法 实现了变量从Controller对象到VIew对象的传递(VIew类的assign就是将数据保存到自己数组中)。</p>
<p>这样,Controller类在调用$this->render()后,视图对象就可以渲染展示这些变量了。</p>
<h2>4.5 模型<span id="43">Model基类</span></h2>
<p>在myphp/目录下,新建一个模型基类,文件名为Model.class.php,文件内容为:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 模型基类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span> Model <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Sql
{
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_model</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_table</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> __construct()
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接数据库</span>
<span style="color: rgba(128, 0, 128, 1)">$this</span>->connect(DB_HOST,DB_USER,DB_PASSWORD,<span style="color: rgba(0, 0, 0, 1)">DB_NAME);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取模型类名称</span>
<span style="color: rgba(128, 0, 128, 1)">$this</span>->_model=<span style="color: rgba(0, 128, 128, 1)">get_class</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_model=<span style="color: rgba(0, 128, 128, 1)">rtrim</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>->_model,'Model');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">rtrim 从字符串右侧移指定字符
//模型类名称与数据库中的表名一致</span>
<span style="color: rgba(128, 0, 128, 1)">$this</span>->_table=<span style="color: rgba(0, 128, 128, 1)">strtolower</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">_model);
}
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> __destruct()
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO: Implement __destruct() method.</span>
<span style="color: rgba(0, 0, 0, 1)"> }
}</span></pre>
</div>
<p>可以看到,model基类继承了Sql类。</p>
<p>因为数据操作比较复杂,所以我为这部分操作单独创建了一个Sql类。</p>
<p>在myphp/目录下,新建一个Sql类,文件名为Sql.class.php,文件内容为:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 数据库操作类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Sql
{
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_dbHandle</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_result</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接数据库</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> connect(<span style="color: rgba(128, 0, 128, 1)">$host</span>,<span style="color: rgba(128, 0, 128, 1)">$user</span>,<span style="color: rgba(128, 0, 128, 1)">$pass</span>,<span style="color: rgba(128, 0, 128, 1)">$dbname</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 128, 1)">$dsn</span>=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("mysql:host=%s;dbname=%s;charset=utf8",<span style="color: rgba(128, 0, 128, 1)">$host</span>,<span style="color: rgba(128, 0, 128, 1)">$dbname</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">sprintf 把百分号(%)符号替换成一个作为参数进行传递的变量:</span>
<span style="color: rgba(128, 0, 128, 1)">$options</span>=<span style="color: rgba(0, 0, 255, 1)">array</span>(PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::<span style="color: rgba(0, 0, 0, 1)">FETCH_ASSOC);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组</span>
<span style="color: rgba(128, 0, 128, 1)">$this</span>->_dbHandle=<span style="color: rgba(0, 0, 255, 1)">new</span> PDO(<span style="color: rgba(128, 0, 128, 1)">$dsn</span>,<span style="color: rgba(128, 0, 128, 1)">$user</span>,<span style="color: rgba(128, 0, 128, 1)">$pass</span>,<span style="color: rgba(128, 0, 128, 1)">$options</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">catch</span>(PDOException <span style="color: rgba(128, 0, 128, 1)">$e</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">exit</span>('错误:'.<span style="color: rgba(128, 0, 128, 1)">$e</span>-><span style="color: rgba(0, 0, 0, 1)">getMessage());
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询所有数据</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> selectAll()
{
</span><span style="color: rgba(128, 0, 128, 1)">$sql</span>=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("select * from `%s`",<span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">_table);
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->_dbHandle->prepare(<span style="color: rgba(128, 0, 128, 1)">$sql</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">execute();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">fetchAll();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据条件(id)查询</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> select(<span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$sql</span>=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("select * from `%s` where `id`='%s'",<span style="color: rgba(128, 0, 128, 1)">$this</span>->_table,<span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->_dbHandle->prepare(<span style="color: rgba(128, 0, 128, 1)">$sql</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">execute();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">fetch();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据条件(id)删除</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> delete(<span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$sql</span>=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("delete from `%s` where `id`='%s'",<span style="color: rgba(128, 0, 128, 1)">$this</span>->_table,<span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->_dbHandle-><span style="color: rgba(0, 0, 0, 1)">prepare();
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">execute();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">rowCount();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自定义sql查询语句,返回影响的行数</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> query(<span style="color: rgba(128, 0, 128, 1)">$sql</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>->_dbHandle->prepare(<span style="color: rgba(128, 0, 128, 1)">$sql</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">execute(<span style="color: rgba(128, 0, 128, 1)">$sql</span>);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sth</span>-><span style="color: rgba(0, 0, 0, 1)">rowCount();
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新增数据</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> add(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$sql</span>=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("insert into `%s` %s",<span style="color: rgba(128, 0, 128, 1)">$this</span>->_table,<span style="color: rgba(128, 0, 128, 1)">$this</span>->formatInsert(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->query(<span style="color: rgba(128, 0, 128, 1)">$sql</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">修改数据</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> update(<span style="color: rgba(128, 0, 128, 1)">$id</span>,<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$sql</span>=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("update `%s` set %s where `id`='%s'",<span style="color: rgba(128, 0, 128, 1)">$this</span>->_table,<span style="color: rgba(128, 0, 128, 1)">$this</span>->formatUpdate(<span style="color: rgba(128, 0, 128, 1)">$data</span>),<span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>->query(<span style="color: rgba(128, 0, 128, 1)">$sql</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将数组转换为insert语句中的数据格式</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
$array=array("id"=>1,"name"=>"jack","age"=>19);
formatInsert($array)返回字符串:
(`id`,`name`,`age`) values ('1','jack','19')
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> formatInsert(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$fields</span>=<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(128, 0, 128, 1)">$values</span>=<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$data</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span>=><span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$fields</span>[]=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("`%s`",<span style="color: rgba(128, 0, 128, 1)">$key</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$values</span>[]=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("'%s'",<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(128, 0, 128, 1)">$filed</span>=<span style="color: rgba(0, 128, 128, 1)">implode</span>(',',<span style="color: rgba(128, 0, 128, 1)">$fields</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">implode 把数组元素组合为字符串:</span>
<span style="color: rgba(128, 0, 128, 1)">$value</span>=<span style="color: rgba(0, 128, 128, 1)">implode</span>(',',<span style="color: rgba(128, 0, 128, 1)">$values</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 128, 128, 1)">sprintf</span>("(%s) values (%s)",<span style="color: rgba(128, 0, 128, 1)">$filed</span>,<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将数组转换为update语句中的数据格式</span>
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
$array=array("name"=>"jack","age"=>19);
formatUpdate($array)返回字符串:
`name`='1',`jack`='19'
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 255, 1)">function</span> formatUpdate(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$fields</span>=<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$data</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span>=><span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$fields</span>[]=<span style="color: rgba(0, 128, 128, 1)">sprintf</span>("`%s`='%s'",<span style="color: rgba(128, 0, 128, 1)">$key</span>,<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 128, 128, 1)">implode</span>(',',<span style="color: rgba(128, 0, 128, 1)">$fields</span><span style="color: rgba(0, 0, 0, 1)">);
}
}</span></pre>
</div>
<h2>4.6 视图View<span id="43">基类</span></h2>
<p><span>在myphp/目录下,新建一个视图基类,文件名为View.class.php,文件内容为:</span></p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 视图基类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> View
{
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$variables</span>=<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_controller</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(128, 0, 128, 1)">$_action</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">function</span> __construct(<span style="color: rgba(128, 0, 128, 1)">$controller</span>,<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_controller=<span style="color: rgba(128, 0, 128, 1)">$controller</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->_action=<span style="color: rgba(128, 0, 128, 1)">$action</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入变量</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> assign(<span style="color: rgba(128, 0, 128, 1)">$name</span>,<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$this</span>->variables[<span style="color: rgba(128, 0, 128, 1)">$name</span>]=<span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">渲染显示</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> render()
{
</span><span style="color: rgba(0, 128, 128, 1)">extract</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-><span style="color: rgba(0, 0, 0, 1)">variables);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">extract - 用来将一个数组分解成多个变量直接使用。</span>
<span style="color: rgba(128, 0, 128, 1)">$defaultHeader</span>=APP_PATH.'application/views/header.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$defaultFooter</span>=APP_PATH.'application/views/footer.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$controllerHeader</span>=APP_PATH.'application/views/'.<span style="color: rgba(128, 0, 128, 1)">$this</span>->_controller.'/header.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$controllerFooter</span>=APP_PATH.'application/views/'.<span style="color: rgba(128, 0, 128, 1)">$this</span>->_controller.'/footer.php'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">页头文件</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$controllerHeader</span><span style="color: rgba(0, 0, 0, 1)">))
{
</span><span style="color: rgba(0, 0, 255, 1)">include</span> (<span style="color: rgba(128, 0, 128, 1)">$controllerHeader</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">include</span> (<span style="color: rgba(128, 0, 128, 1)">$defaultHeader</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">页内容文件</span>
<span style="color: rgba(0, 0, 255, 1)">include</span> (APP_PATH.'application/views/'.<span style="color: rgba(128, 0, 128, 1)">$this</span>->_controller.'/'.<span style="color: rgba(128, 0, 128, 1)">$this</span>->_action.'.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">页脚文件</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$controllerFooter</span><span style="color: rgba(0, 0, 0, 1)">))
{
</span><span style="color: rgba(0, 0, 255, 1)">include</span> (<span style="color: rgba(128, 0, 128, 1)">$controllerFooter</span><span style="color: rgba(0, 0, 0, 1)">);
} </span><span style="color: rgba(0, 0, 255, 1)">else </span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">include</span> (<span style="color: rgba(128, 0, 128, 1)">$defaultFooter</span><span style="color: rgba(0, 0, 0, 1)">);
}
}
}</span></pre>
</div>
<p>至此,核心的PHP MVC框架核心就搭建完成了。</p>
<p>下面,我要编写基于框架的应用代码来测试这个框架的功能。</p>
<h1>5、基于框架的应用</h1>
<h2>5.1 部署数据库</h2>
<p>在SQL中新建一个数据库 myphpdb,增加一个item表,并插入表中2个记录,SQL命令如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">CREATE</span> <span style="color: rgba(0, 0, 255, 1)">DATABASE</span> `myphpdb` <span style="color: rgba(0, 0, 255, 1)">DEFAULT</span> <span style="color: rgba(0, 0, 255, 1)">CHARACTER</span> <span style="color: rgba(0, 0, 255, 1)">SET</span><span style="color: rgba(0, 0, 0, 1)"> utf8 COLLATE utf8_general_ci;
</span><span style="color: rgba(0, 0, 255, 1)">USE</span><span style="color: rgba(0, 0, 0, 1)"> `myphpdb`;
</span><span style="color: rgba(0, 0, 255, 1)">CREATE</span> <span style="color: rgba(0, 0, 255, 1)">TABLE</span><span style="color: rgba(0, 0, 0, 1)"> `item`(
`id` </span><span style="color: rgba(0, 0, 255, 1)">int</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">11</span>) <span style="color: rgba(128, 128, 128, 1)">NOT</span> <span style="color: rgba(0, 0, 255, 1)">NULL</span><span style="color: rgba(0, 0, 0, 1)"> auto_increment,
`item_name` </span><span style="color: rgba(0, 0, 255, 1)">varchar</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">255</span>) <span style="color: rgba(128, 128, 128, 1)">NOT</span> <span style="color: rgba(0, 0, 255, 1)">NULL</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 0, 255, 1)">PRIMARY</span> <span style="color: rgba(0, 0, 255, 1)">KEY</span><span style="color: rgba(0, 0, 0, 1)"> (`id`)
)ENGINE</span><span style="color: rgba(128, 128, 128, 1)">=</span>InnoDB AUTO_INCREMENT<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span> <span style="color: rgba(0, 0, 255, 1)">DEFAULT</span> CHARSET<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(0, 0, 0, 1)">utf8;
</span><span style="color: rgba(0, 0, 255, 1)">INSERT</span> <span style="color: rgba(0, 0, 255, 1)">INTO</span> `item` <span style="color: rgba(0, 0, 255, 1)">VALUES</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">Hello World.</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">INSERT</span> <span style="color: rgba(0, 0, 255, 1)">INTO</span> `item` <span style="color: rgba(0, 0, 255, 1)">VALUES</span>(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">2</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">Let\</span><span style="color: rgba(255, 0, 0, 1)">'</span>s <span style="color: rgba(0, 0, 255, 1)">go</span>!<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">);</span></pre>
</div>
<h2>5.2 部署模型</h2>
<p>在application/models/目录下,创建一个ItemModel.php文件,主要功能是增加了检索数据的业务逻辑,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 128, 128, 1)"><</span><span style="color: rgba(0, 0, 0, 1)">?php
</span><span style="color: rgba(0, 128, 128, 1)">/*</span><span style="color: rgba(0, 128, 128, 1)">*
* 用户Model
</span><span style="color: rgba(0, 128, 128, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
class ItemModel extends Model
{
</span><span style="color: rgba(0, 128, 128, 1)">/*</span><span style="color: rgba(0, 128, 128, 1)">*
* 自定义当前模型操作的数据库表名称
* 如果不指定,则默认为类名称的小写字符串,
* 此处为item 表
* </span><span style="color: rgba(0, 128, 128, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> $_<span style="color: rgba(0, 0, 255, 1)">table</span><span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">item</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">/*</span><span style="color: rgba(0, 128, 128, 1)">*
* 搜索功能,以为sql父类中,并没有现成的like搜索
* 所以需要自己写sql语句,对数据库的操作应该都放
* 在Model中,然后提供给Controller直接调用
</span><span style="color: rgba(0, 128, 128, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> search($keyword)
{
$sql</span><span style="color: rgba(128, 128, 128, 1)">=</span>sprintf("<span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> `<span style="color: rgba(128, 128, 128, 1)">%</span>s` <span style="color: rgba(0, 0, 255, 1)">where</span> `item_name` <span style="color: rgba(128, 128, 128, 1)">like</span> <span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">%%%s%%</span><span style="color: rgba(255, 0, 0, 1)">'</span>",$this<span style="color: rgba(128, 128, 128, 1)">-></span>_<span style="color: rgba(0, 0, 255, 1)">table</span><span style="color: rgba(0, 0, 0, 1)">,$keyword);
$sth</span><span style="color: rgba(128, 128, 128, 1)">=</span>$this<span style="color: rgba(128, 128, 128, 1)">-></span>_dbHandle<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 255, 1)">prepare</span><span style="color: rgba(0, 0, 0, 1)">($sql);
$sth</span><span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 255, 1)">execute</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">return</span> $sth<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">fetchAll();
}</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)">因为 Item 模型继承了 Model基类,所以它拥有 Model 基类的所有功能。</span></p>
<h2>5.3 部署控制器</h2>
<p><span style="color: rgba(0, 0, 0, 1)">在application/controllers/目录下,创建一个ItemController.php文件,主要功能是准备数据、调用对应的视图,文件内容为:<br></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 128, 128, 1)"><</span><span style="color: rgba(0, 0, 0, 1)">?php
</span><span style="color: rgba(0, 128, 128, 1)">/*</span><span style="color: rgba(0, 128, 128, 1)">*
* Item控制器类
</span><span style="color: rgba(0, 128, 128, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
class ItemController extends Controller
{
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">首页文件,测试myphp框架自定义的sql查询
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> <span style="color: rgba(0, 0, 255, 1)">index</span><span style="color: rgba(0, 0, 0, 1)">()
{
$keyword</span><span style="color: rgba(128, 128, 128, 1)">=</span>isset($_GET<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'keyword'</span><span style="color: rgba(255, 0, 0, 1)">]</span>)?$_GET<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'keyword'</span><span style="color: rgba(255, 0, 0, 1)">]</span>:<span style="color: rgba(255, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> ($keyword)
{
$items</span><span style="color: rgba(128, 128, 128, 1)">=</span>(new ItemModel())<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">search($keyword);
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
$items</span><span style="color: rgba(128, 128, 128, 1)">=</span>(new ItemModel())<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">selectAll();
}
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">传入视图数据
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">title</span><span style="color: rgba(255, 0, 0, 1)">'</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">全部条目</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">keyword</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,$keyword);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">items</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,$items);
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">渲染试图
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">render();
}
</span><span style="color: rgba(128, 128, 128, 1)">//</span>添加记录,测试myphp框架的sql查询<span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 255, 1)">create</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> <span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)">()
{
$data</span><span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'item_name'</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(128, 128, 128, 1)">=</span>$_POST<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'value'</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">;
$</span><span style="color: rgba(255, 0, 255, 1)">count</span><span style="color: rgba(128, 128, 128, 1)">=</span>(new ItemModel)<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)">($data);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">title</span><span style="color: rgba(255, 0, 0, 1)">'</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">添加成功</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">count</span><span style="color: rgba(255, 0, 0, 1)">'</span>,$<span style="color: rgba(255, 0, 255, 1)">count</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">渲染试图
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">render();
}
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">操作管理
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> manage($id<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
{
$item </span><span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(0, 0, 0, 1)"> array();
$postUrl</span><span style="color: rgba(128, 128, 128, 1)">=</span>APP_URL.<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">/item/add</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">($id)
{
$item</span><span style="color: rgba(128, 128, 128, 1)">=</span>(new ItemModel)<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 255, 1)">select</span><span style="color: rgba(0, 0, 0, 1)">($id);
$postUrl</span><span style="color: rgba(128, 128, 128, 1)">=</span>APP_URL.<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">/item/update</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
}
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">title</span><span style="color: rgba(255, 0, 0, 1)">'</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">管理条目</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">item</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,$item);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">postUrl</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,$postUrl);
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">渲染试图
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">render();
}
</span><span style="color: rgba(128, 128, 128, 1)">//</span>更新记录,测试框架的sql查询<span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 255, 1)">update</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> <span style="color: rgba(0, 0, 255, 1)">update</span><span style="color: rgba(0, 0, 0, 1)">()
{
$data</span><span style="color: rgba(128, 128, 128, 1)">=</span>array(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(128, 128, 128, 1)">=></span>$_POST<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'id'</span><span style="color: rgba(255, 0, 0, 1)">]</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">item_name</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(128, 128, 128, 1)">=></span>$_POST<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'value'</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">);
$</span><span style="color: rgba(255, 0, 255, 1)">count</span><span style="color: rgba(128, 128, 128, 1)">=</span>(new ItemModel)<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 255, 1)">update</span>($data<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">'id'</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">,$data);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">title</span><span style="color: rgba(255, 0, 0, 1)">'</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">修改成功</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">count</span><span style="color: rgba(255, 0, 0, 1)">'</span>,$<span style="color: rgba(255, 0, 255, 1)">count</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">渲染试图
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">render();
}
</span><span style="color: rgba(128, 128, 128, 1)">//</span>删除记录,测试框架的sql查询<span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 255, 1)">delete</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> <span style="color: rgba(0, 0, 255, 1)">delete</span>($id<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
{
$</span><span style="color: rgba(255, 0, 255, 1)">count</span><span style="color: rgba(128, 128, 128, 1)">=</span>(new ItemModel)<span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)">($id);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">title</span><span style="color: rgba(255, 0, 0, 1)">'</span>,<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">删除成功</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span>assign(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">count</span><span style="color: rgba(255, 0, 0, 1)">'</span>,$<span style="color: rgba(255, 0, 255, 1)">count</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 128, 128, 1)">//</span><span style="color: rgba(0, 0, 0, 1)">渲染试图
$this</span><span style="color: rgba(128, 128, 128, 1)">-></span><span style="color: rgba(0, 0, 0, 1)">render();
}
}</span></pre>
</div>
<h2>5.3 部署视图</h2>
<p>在 application/views/目录下新建 header.php 和 footer.php 两个页头页脚模板文件,文件内容为:</p>
<p><strong>header.php 内容:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">http-equiv</span><span style="color: rgba(0, 0, 255, 1)">="Content-Type"</span><span style="color: rgba(255, 0, 0, 1)"> content</span><span style="color: rgba(0, 0, 255, 1)">="text/html; charsert=utf-8"</span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $title; </span><span style="color: rgba(0, 0, 255, 1)">?></span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">link </span><span style="color: rgba(255, 0, 0, 1)">rel</span><span style="color: rgba(0, 0, 255, 1)">="stylesheet"</span><span style="color: rgba(255, 0, 0, 1)"> href</span><span style="color: rgba(0, 0, 255, 1)">="/static/css/main.css"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="text/css"</span> <span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $title; </span><span style="color: rgba(0, 0, 255, 1)">?></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong>footer.php 内容:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>页头文件使用了<strong>main.css</strong>文件,内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">html,body</span>{<span style="color: rgba(255, 0, 0, 1)">
margin</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 10px</span>;<span style="color: rgba(255, 0, 0, 1)">
font-size</span>:<span style="color: rgba(0, 0, 255, 1)"> 20px</span>;
}<span style="color: rgba(128, 0, 0, 1)">
input</span>{<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)">black</span>;<span style="color: rgba(255, 0, 0, 1)">
font-family</span>:<span style="color: rgba(0, 0, 255, 1)"> Georgia, times</span>;<span style="color: rgba(255, 0, 0, 1)">
font-size</span>:<span style="color: rgba(0, 0, 255, 1)">24px</span>;<span style="color: rgba(255, 0, 0, 1)">
font-weight</span>:<span style="color: rgba(0, 0, 255, 1)">normal</span>;<span style="color: rgba(255, 0, 0, 1)">
line-height</span>:<span style="color: rgba(0, 0, 255, 1)"> 1.2em</span>;
}<span style="color: rgba(128, 0, 0, 1)">
a</span>{<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)">blue</span>;<span style="color: rgba(255, 0, 0, 1)">
font-family</span>:<span style="color: rgba(0, 0, 255, 1)"> Georgia,times</span>;<span style="color: rgba(255, 0, 0, 1)">
font-size</span>:<span style="color: rgba(0, 0, 255, 1)"> 20px</span>;<span style="color: rgba(255, 0, 0, 1)">
font-weight</span>:<span style="color: rgba(0, 0, 255, 1)"> normal</span>;<span style="color: rgba(255, 0, 0, 1)">
line-height</span>:<span style="color: rgba(0, 0, 255, 1)"> 1.2em</span>;<span style="color: rgba(255, 0, 0, 1)">
text-decoration</span>:<span style="color: rgba(0, 0, 255, 1)"> none</span>;
}<span style="color: rgba(128, 0, 0, 1)">
a:hover</span>{<span style="color: rgba(255, 0, 0, 1)">
text-decoration</span>:<span style="color: rgba(0, 0, 255, 1)"> underline</span>;
}<span style="color: rgba(128, 0, 0, 1)">
h1</span>{<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)"> #000000</span>;<span style="color: rgba(255, 0, 0, 1)">
font-size</span>:<span style="color: rgba(0, 0, 255, 1)"> 41px</span>;<span style="color: rgba(255, 0, 0, 1)">
letter-spacing</span>:<span style="color: rgba(0, 0, 255, 1)"> -2px</span>;<span style="color: rgba(255, 0, 0, 1)">
line-height</span>:<span style="color: rgba(0, 0, 255, 1)"> 1em</span>;<span style="color: rgba(255, 0, 0, 1)">
font-family</span>:<span style="color: rgba(0, 0, 255, 1)"> helvetica,Arial,sans-serif</span>;<span style="color: rgba(255, 0, 0, 1)">
border-bottom</span>:<span style="color: rgba(0, 0, 255, 1)"> 1px dotted #cccccc</span>;
}<span style="color: rgba(128, 0, 0, 1)">
td</span>{<span style="color: rgba(255, 0, 0, 1)">
padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 1px 30px 1px 0</span>;
}</pre>
</div>
<p>现在,在application/view/item/目录下,创建以下几个视图文件。</p>
<p><strong>index.php</strong>,作用是展示数据库中item表的所有记录、检索记录、删除记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">form </span><span style="color: rgba(255, 0, 0, 1)">action</span><span style="color: rgba(0, 0, 255, 1)">=""</span><span style="color: rgba(255, 0, 0, 1)"> method</span><span style="color: rgba(0, 0, 255, 1)">="get"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo $keyword;?>"</span><span style="color: rgba(255, 0, 0, 1)"> name</span><span style="color: rgba(0, 0, 255, 1)">="keyword"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="submit"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="搜索"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/manage"</span><span style="color: rgba(0, 0, 255, 1)">></span>新建<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">table</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">></span>ID<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">></span>内容<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">></span>操作<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php foreach ($items as $item):</span><span style="color: rgba(0, 0, 255, 1)">?></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $item['id']; </span><span style="color: rgba(0, 0, 255, 1)">?></span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $item['item_name']; </span><span style="color: rgba(0, 0, 255, 1)">?></span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/manage/<?php echo $item['id']; ?>"</span><span style="color: rgba(0, 0, 255, 1)">></span>编辑<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/delete/<?php echo $item['id']; ?>"</span><span style="color: rgba(0, 0, 255, 1)">></span>删除<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php endforeach;</span><span style="color: rgba(0, 0, 255, 1)">?></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">table</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong>manage.php</strong>,作用是编辑记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">form </span><span style="color: rgba(255, 0, 0, 1)">action</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo $postUrl; ?>"</span><span style="color: rgba(255, 0, 0, 1)"> method</span><span style="color: rgba(0, 0, 255, 1)">="POST"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php if(isset($item['id'])): </span><span style="color: rgba(0, 0, 255, 1)">?></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="hidden"</span><span style="color: rgba(255, 0, 0, 1)"> name</span><span style="color: rgba(0, 0, 255, 1)">="id"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo $item['id']; ?>"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php endif; </span><span style="color: rgba(0, 0, 255, 1)">?></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(255, 0, 0, 1)"> name</span><span style="color: rgba(0, 0, 255, 1)">="value"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo isset($item['item_name'])?$item['item_name']:''; ?>"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="submit"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="提交"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="big"</span><span style="color: rgba(255, 0, 0, 1)"> href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/index"</span><span style="color: rgba(0, 0, 255, 1)">></span>返回<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong>add.php</strong>,作用是提示 已添加记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="big"</span><span style="color: rgba(255, 0, 0, 1)"> href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/index"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
成功添加</span><span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $count; </span><span style="color: rgba(0, 0, 255, 1)">?></span><span style="color: rgba(0, 0, 0, 1)">条记录,点击返回
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong>update.php</strong>,作用是提示 已修改记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="big"</span><span style="color: rgba(255, 0, 0, 1)"> href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/index"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
成功修改</span><span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $count; </span><span style="color: rgba(0, 0, 255, 1)">?></span><span style="color: rgba(0, 0, 0, 1)">项,点击返回
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong>delete.php</strong>,作用是提示 已删除记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">a </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="<?php echo APP_URL; ?>item/index"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
成功删除</span><span style="color: rgba(0, 0, 255, 1)"><?</span><span style="color: rgba(255, 0, 255, 1)">php echo $count; </span><span style="color: rgba(0, 0, 255, 1)">?></span><span style="color: rgba(0, 0, 0, 1)">项,点击返回
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>至此,所有的应用代码已经编写完成。</p>
<h1>6、访问应用</h1>
<p>在浏览器中访问 http://localhost/MyPhpFrame1/ ,成功!</p>
<p><img src="https://img2018.cnblogs.com/blog/1847743/201910/1847743-20191031182113547-1541185582.png"></p>
<p style="text-align: left"><span style="font-size: 16px">严重参考:</span></p>
<p style="text-align: left"><span style="font-size: 16px">https://www.awaimai.com/128.html</span></p>
<p style="text-align: left"><span style="font-size: 16px">https://www.cnblogs.com/Steven-shi/p/5914175.html</span></p>
<p style="text-align: left"><span style="font-size: 16px">感谢他们的分享!!</span></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/0ops/p/11762207.html
頁:
[1]