雾里玄 發表於 2019-10-31 18:26:00

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&amp;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>&nbsp;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>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</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)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">IfModule</span><span style="color: rgba(0, 0, 255, 1)">&gt;</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>&nbsp; 当请求地址不是真实存在的文件或目录时,请求就会传给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>&lt;?<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>-&gt;run();</pre>
</div>
<p>&nbsp;</p>
<p>可以看到,上面的php代码并没有使用php结束符 ?&gt;。</p>
<p>纯php代码中php结束符是可选的,提倡不写php结束符。如果这个是一个被别人require的php文件,没有这个结束符,可以避免多余输出(也就是?&gt;之后的任何数据,包括空格、换行符等)导致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>&lt;?<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>&nbsp;在入口文件中,对框架类做了两步操作:实例化、调用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>&lt;?<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>-&gt;<span style="color: rgba(0, 0, 0, 1)">setReporting();
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">removeMagicQuotes();
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">unregisterGlobals();
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<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-&gt;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-&gt;$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>-&gt;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>-&gt;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>-&gt;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>-&gt;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>=&gt;<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>.')&lt;br /&gt;'<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>.'&lt;br/&gt;'<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>.'&lt;br/&gt;'<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>.'&lt;br/&gt;'<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>.'&lt;br /&gt;'<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>.'&lt;br /&gt;'<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>.'&lt;br /&gt;'<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>.'&lt;br /&gt;'<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>.'&lt;br /&gt;'<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>.'&lt;br /&gt;'<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>.')结束&lt;br /&gt;'<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>&nbsp;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()处理后:&nbsp;&nbsp;&nbsp; </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>&nbsp;处理完成后,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>&lt;?<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>-&gt;_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>-&gt;_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>-&gt;_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-&gt;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>-&gt;_view-&gt;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>-&gt;_view-&gt;<span style="color: rgba(0, 0, 0, 1)">render();
    }
}</span></pre>
</div>
<p>Controller类通过 assign()方法 实现了变量从Controller对象到VIew对象的传递(VIew类的assign就是将数据保存到自己数组中)。</p>
<p>这样,Controller类在调用$this-&gt;render()后,视图对象就可以渲染展示这些变量了。</p>
<h2>4.5 模型<span id="43">Model基类</span></h2>
<p>在myphp/目录下,新建一个模型基类,文件名为Model.class.php,文件内容为:</p>
<div class="cnblogs_code">
<pre>&lt;?<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>-&gt;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>-&gt;_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>-&gt;_model=<span style="color: rgba(0, 128, 128, 1)">rtrim</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_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>-&gt;_table=<span style="color: rgba(0, 128, 128, 1)">strtolower</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<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>&lt;?<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=&gt;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>-&gt;_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>-&gt;<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>-&gt;<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>-&gt;_dbHandle-&gt;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>-&gt;<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>-&gt;<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>-&gt;_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>-&gt;_dbHandle-&gt;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>-&gt;<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>-&gt;<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>-&gt;_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>-&gt;_dbHandle-&gt;<span style="color: rgba(0, 0, 0, 1)">prepare();
      </span><span style="color: rgba(128, 0, 128, 1)">$sth</span>-&gt;<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>-&gt;<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>-&gt;_dbHandle-&gt;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>-&gt;<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>-&gt;<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>-&gt;_table,<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;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>-&gt;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>-&gt;_table,<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;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>-&gt;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"=&gt;1,"name"=&gt;"jack","age"=&gt;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>=&gt;<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"=&gt;"jack","age"=&gt;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>=&gt;<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>&lt;?<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>-&gt;_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>-&gt;_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>-&gt;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>-&gt;<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>-&gt;_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>-&gt;_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>-&gt;_controller.'/'.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_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)">&lt;</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)">-&gt;</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)">-&gt;</span>_dbHandle<span style="color: rgba(128, 128, 128, 1)">-&gt;</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)">-&gt;</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)">-&gt;</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)">&lt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">=&gt;</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)">=&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">-&gt;</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)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $title; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $title; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>footer.php 内容:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</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)">&lt;</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo $keyword;?&gt;"</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/manage"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>新建<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">table</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>ID<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>内容<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>操作<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">th</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php foreach ($items as $item):</span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $item['id']; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $item['item_name']; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/manage/&lt;?php echo $item['id']; ?&gt;"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>编辑<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/delete/&lt;?php echo $item['id']; ?&gt;"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>删除<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">td</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">tr</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php endforeach;</span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">table</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>manage.php</strong>,作用是编辑记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo $postUrl; ?&gt;"</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php if(isset($item['id'])): </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo $item['id']; ?&gt;"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php endif; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo isset($item['item_name'])?$item['item_name']:''; ?&gt;"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">form</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/index"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>返回<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>add.php</strong>,作用是提示 已添加记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/index"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
    成功添加</span><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $count; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span><span style="color: rgba(0, 0, 0, 1)">条记录,点击返回
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>update.php</strong>,作用是提示 已修改记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/index"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
    成功修改</span><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $count; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span><span style="color: rgba(0, 0, 0, 1)">项,点击返回
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><strong>delete.php</strong>,作用是提示 已删除记录,文件内容为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</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)">="&lt;?php echo APP_URL; ?&gt;item/index"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
    成功删除</span><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">php echo $count; </span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span><span style="color: rgba(0, 0, 0, 1)">项,点击返回
</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>至此,所有的应用代码已经编写完成。</p>
<h1>6、访问应用</h1>
<p>在浏览器中访问 http://localhost/MyPhpFrame1/&nbsp; ,成功!</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>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/0ops/p/11762207.html
頁: [1]
查看完整版本: PHP MVC框架【Myphp】的编写