仓酷云

标题: PHP教程之MVC with PHP(二) [打印本页]

作者: 透明    时间: 2015-2-4 00:29
标题: PHP教程之MVC with PHP(二)
培训的第四阶段,就是应用PHP语言开发实际的程序。以结合实际的项目开发来进行学习,效果真的很好,在学习完之后就开始练习,能比较容易掌握所学的知识,这是学校的学习所没法比的。   MVC with PHP(一)中的bug的成绩是存在,最大的成绩是日记体系的成绩,等完成这这个引见后我后把全体更正的法式源码打包
出来,这里就临时不做更改了.
先来看看在application.class.php中是若何创立controller实例的:

PHP代码:--------------------------------------------------------------------------------
/**
* 履行函数
*
* 此类独一对外的一个接口
**/
public function run()
{
$this->parsePath();
$this->checkSecurity($this->module, $this->action);
1. $controller = new $this->controllerClassName();
2. $controller->{$this->action}();
$this->writeLog($this->module, $this->action);
}

--------------------------------------------------------------------------------

Application这个类在实例后独一可停止挪用的一个函数,它依据用户的URL恳求来剖析得出所需求的Controller类名,然后实例化这个类(下面标1的中央),再挪用从URL中获得的举措称号(下面标2的中央),

这个举一个复杂的例子:
URL: http://localhost/?module=news&action=showList
Application经由过程剖析这个URL重到controllerClassName=news, action=showList,然后它将在包括处置这个controller类的文件名(在Application->getControllerFile()中停止),然后实例化News这个
controller类(标1的中央), 随后挪用它的举措showList(标2的中央).
来看看newsController.php中的内容:
=============================================================

PHP代码:--------------------------------------------------------------------------------

<?php
/**
* FileName: newsController.php
* Introduce: 旧事掌握类
*
* @author: 巨匠兄
* @Email: teacherli@163.com
* @version $Id$
* @copyright 2004-10-26
**/
include_once ("./controller/comm/controller.class.php");
include_once ("./model/news/newsModel.php");

class NewsController extends Controller
{
private $model;

/**
* 机关函数
*
**/
public function __construct()
{
parent::__construct();
$this->model = new NewsModel();
$this->setSmartyTemplate_dir("./view/news");
}

/**
* 显示旧事列表
*
**/
public function showList()
{
1. $newsList = & $this->model->getList();

2. $this->smarty->assign("newsList", $newsList);
3. unset($newsList);

4. $this->smarty->display("newsList.html");
}
}
?>

--------------------------------------------------------------------------------

==============================================================
起首,NewsController类承继自公共类Controller,在类停止初始化时发生一个NewsModel类,这个类是一个model类,由这个类担任旧事模块一切的对数据库的交互. parent::__construct()挪用父类的机关函数,完成对view的掌握类Smarty的初始化.$this->setSmartyTemplate_dir("./view/news")将模板目次定位在./view/news目次.

然后看咱们下面的例子,恳求URL为http://localhost/?module=news&actio...List,暗示要挪用
showList这个举措,看NewsController类的showList()成员函数:
1. $newsList = & $this->model->getList(): $this->model在NewsController初始化时创立,这一句要利用$this->model从数据库里提掏出一个旧事列表,这个列表固然就是Smarty在操作轮回块时需求的二维数组了,在NewsModel类中,它是采取ADODB回传的一个二维数组.
2. $this->smarty->assign("newsList", $newsList): 熟习吧,smarty中轮回块的法式掌握
3. unset($newsList):思索到效力成绩,关于这些一时变量在利用完成后即时将它unset。
4. $this->smarty->display("newsList.html"):利用smarty来显示view.

人人看分明了吗?实践上controller类要做的工作就是如许:1.挪用model从数据库掏出纪录 2.操

作Smarty显示view。
再来看看NewsController的父类Controller类的源码:
===========================================================

PHP代码:--------------------------------------------------------------------------------

<?php
/**
* FileName: controller.class.php
* Introduce: Base class of controller
*
* @author: 李晓军
* @Email: teacherli@163.com
* @version $Id$
* @copyright 2004-10-26
**/

include_once ("./comm/smarty/Smarty.class.php");
include_once ("./comm/config.inc.php");

abstract class Controller
{
private $smarty;

/**
* 体系构建函数
* 初始化Smarty
**/
function __construct()
{
$this ->smarty = new Smarty();

$this->smarty->template_dir = "./view/templates";
$this->smarty->compile_dir = "./view/templates_c";
$this->smarty->cache_dir = "./view/cache";
$this->smarty->cache_lifetime = 60 * 60 * 24;
$this->smarty->caching = false;
$this->smarty->left_delimiter = "<{";
$this->smarty->right_delimiter = "}>";
}

/**
* 设置smarty模板途径
*
* @param string $template
**/
public function setSmartyTemplate_dir($template)
{
$this->smarty->template_dir = $template;
}

/**
* 设置smarty是不是停止缓存
*
* @param boolean $cache
**/
public function setSmartyCache($cache = false)
{
$this->smarty->cache = $cache;
}

/**
* 设置smarty缓存工夫
*
* @param string $cacheLifetime
**/
public function setSmartyCacheTime($cacheLifetime)
{
$this->smarty->cache_lifetime = $cacheLifetime;
}

/**
* 举措被履行后一个长久的提醒
*
* @param string $module 从头定向到的模块称号
* @param string $action 从头定向的举措称号
* @param string $params 参数称号
* @param string $message 提醒信息
**/
public function redirect($module, $action, $params="", $message="举措已被胜利执

行")
{
$time = WAIT_FOR_TIME;
$params = ("" == $params) ? "" : "&$params";
$URL = "?module=" . $module . "&action=" . $action . $params;

//从头定Smarty模板目次大公用目次
$this->setSmartyTemplate_dir("./view/templates");
$this->smarty->assign("URL", $URL); //重定向的目次
$this->smarty->assign("message", $message); //提醒信息
$this->smarty->assign("time", $time);
$this->smarty->display("wait.html");
}

/**
* 挪用本类不存在的办法时停止的处置
*
* @param string $name
* @param string $parameter
**/
public function __call($name, $parameter)
{
throw new ActionNotAllowException("对不起,你所恳求的举措 <b>$name</b> 没有界说

...<br>");
}

/**
* 析构函数
*
**/
public function __destruct()
{
unset($this->smarty);
}
}
?>

--------------------------------------------------------------------------------

==============================================
Controller是一个笼统类,也就是说它不成以直接利用new 来发生一个实例对象,在类的机关函数里发生一个Smarty类,并对其停止根基的设置。其它的几个函数是对Smarty对象停止设置的成员函数, 这里来看看这两个函数:

public function redirect($module, $action, $params="", $message="举措已被胜利履行"):
这是一个从头定向成员函数,它的感化是当咱们对模块停止一些操作后给出的提醒页面,然后经由设置好的工夫主动从头定向到另外一个地位,例如咱们要对旧事停止一些删除,删除胜利后咱们要给用户前往如许一个页面,告知用户操作已胜利,请待n秒后主动前往....这在服装论坛中是很罕见的,这里我也援用了如许的战略。

public function __call($name, $parameter):
当类挪用类没有声明的函数时利用这个函数停止处置,这可是个好东东,有了它,可使用对法式

的掌握加倍复杂了,人人可以尝尝这个办法....

好了,Controller 局部就谈到这里了。

  在学习HTML中我想边学边做是最有效的方式,当然这一方式对于学习PHP同样是最有效的。
作者: 小魔女    时间: 2015-2-4 13:14
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者: 谁可相欹    时间: 2015-2-6 16:47
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 乐观    时间: 2015-2-18 15:06
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 飘飘悠悠    时间: 2015-3-4 11:15
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 兰色精灵    时间: 2015-3-11 05:15
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: 因胸联盟    时间: 2015-3-12 16:36
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 小妖女    时间: 2015-3-20 00:13
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者: 再现理想    时间: 2015-3-24 05:30
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 只想知道    时间: 2015-3-30 18:48
本文当是我的笔记啦,遇到的问题随时填充
作者: 精灵巫婆    时间: 2015-4-5 21:30
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 愤怒的大鸟    时间: 2015-4-12 16:22
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者: 莫相离    时间: 2015-4-15 20:02
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 小女巫    时间: 2015-4-28 21:58
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 深爱那片海    时间: 2015-5-2 00:36
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 蒙在股里    时间: 2015-5-4 05:28
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 简单生活    时间: 2015-5-9 20:04
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 若相依    时间: 2015-5-12 00:23
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 若天明    时间: 2015-6-13 07:34
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2