PHP----MVC-v1.0, 前序

来源:互联网 发布:新手怎么选择基金 知乎 编辑:程序博客网 时间:2024/06/05 04:33

MVC: 模式化

controller 是一个php文件,由浏览器直接请求    根据请求1:决定需要什么数据,并去调用模型文件(类),去获取该数据    根据请求2:决定需要将数据显示在哪个视图文件中(include('header.html'))    $obj  = new dbModel();    $data = $obj->getAllUser();    <a href="userController.class.php?act=show"></a>  //通过参数控制页面:要显示的内容    userController.class.php  继承 Controller.class.php    require_once './UserModel.class.php';    require_once './ModelFactory.class.php';    require_once './Controller.class.php';    class UserController extends  Controller{        function showAction(){            //调用userModel            $obj = ModelFactory::M("UserModel");            $result = $obj->InsertUser($_POST['username'], $_POST['password']);            include './show.html';        }        function detailAction(){}        function deleteAction(){             $this->gotoUrl("删除功能!", "?", 3);        }    }    $ctrl = new userController();    $act = !empty($_GET['act']) ? $_GET['act'] : 'Index';    $active = $act . "Action";    $active();   //调用可变函数  

Model

Model: 是一个php文件,不能直接请求,只能"被载入"而发挥作用    根据控制器的要求去生产数据s    方法可能需要一些参数来获取数据,连接数据库。UserModel.class.php    getAllUser();   //获取所有用户    getUserById($id); //根据id获取该用户    ...设计:一个数据库对应一个model(UserModel.clss.php) 继承于 Model.class.php(连接数据库,常用有方法。 此类只对model调用)Model.class.php 内容如下:require_once "./db.class.php";class BaseModel{    protected $_dao = null;   //用于存储数据库工具类的实例(对象)    function __construct(){        $config = array(            'host'=>'localhost',            'port'=>3306,            'user'=>"root",            'poss'=>"123456",            'charset'=>'utf8',            'dbname'=>'test'        );        $this->_dao = DB::getInstance($config);    }}

View

View: 是一个'伪Html文件',因为其中有极简单的php代码,不应由浏览器直接请求    结合html, css 代码,显示相应的(变量)数据    echo data;

实图典型做法:

数据分为    普通数据:echo #v;    数据数据:foreach($data as $k=>$v){...}    echo $data['id'];    对象数据:echo $obj->p1;控制器典型做法:1. 设定编码: 因为是控制器决定显示什么数据,也就应该由其来决定使用什么编码,一般使用一种相对固定的编码,统一设置2. 页面的简短信息显示,及跳转功能Controller{    function __construct(){        header("content-type:text/html; charset=utf-8");    }    //显示一定的提示文字,然后,自动跳转    function gotoUrl($msg, $url, $time=3){        echo $msg;        echo "<a href='$url'>返回</a>";        echo "<br /> 页面将在{$time}秒之后自动 跳转";        header("refresh: $time; url = $url"); //自动定时跳转功能    }}//单例工厂类:class ModelFactory{    //用于存储各个模型类的唯一实例(单例)    static $all_model = array();    static function M($model_name){        //判断此模型是否存在,是否是实例        if(!isset(static::$all_model[$model_name]) || !(static::$all_model[$model_name] instanceof $model_name)){            static::$all_model[$model_name] = new $model_name();        }        return static::$all_model[$model_name];    }}//testclass A{}var_dump(ModelFactory::M(A));echo '<br>';var_dump(ModelFactory::M(A));

MVC 写法进级

1. 原始写法(很多的else if)     addAction(){        $obj = ModelFactory::M("UserModel");        $result = $obj->InsertUser($_POST['username'], $_POST['password']);        echo 'add success~';    }    if(!empty($_GET['act']) && $_GET['act'] == Add){        addAction();    }else if(){}2. 改进:函数封装(调用上面的方法)--可以将act 简写为:a    $act = !empty($_GET['act']) ? $_GET['act'] : 'Index';    $active = $act . "Action";    $active();   //调用可变函数3. 终级改进:类封装(将上面的函数封装成一个类)    $ctrl = new userController();    $act = !empty($_GET['act']) ? $_GET['act'] : 'Index';    $ctrl->$active = $act . "Action";    $ctrl->$active();   //调用可变函数

基础入口文件的设定

$p = !empty($_GET['p']) ? $_GET['p'] : 'front';   //选择平台。默认为前台在index.phpdefine("PLAT", $p);    //平台define("DS", DIRECTORY_SEPARATOR);   //目录分隔符自动匹配:win:\, unix:/define("ROOT", __DIR__ . DS);define("APP", ROOT . 'application' . DS);     //application 的完整路径define("FRAMEWORK", ROOT . 'framework' . DS);define("PLAT_PATH", APP . PLAT . DS);define("CTRL_PATH", PLAT_PATH . "Controller" . DS);  //当前控制器所在目录define("MODEL_PATH", PLAT_PATH . "Model" . DS); define("VIEW_PATH", PLAT_PATH . "View" . DS);-示例:只留文件名include './Application/back/view/login.html';include VIEW_PATH . 'login.html';-自动加载--只能对类文件自动加载require_once FRAMEWORK . "Db.class.php";require_once MODEL_PATH . $c . "Model.class.php";require_once FRAMEWORK . "ModelFactory.class.php";require_once CTRL_PATH . $c ."Controller.class.php";自动加载代替上面几行:按需加载function __autoload($clsss){    $base_class = array("Db", "Model", "ModelFactory", "Controller");    if(in_array( $class, $base_class )){        require FRAMEWORK . $class . '.class.php';   //基础模型类    }else if(substr($clsss, -5) == "Model"){        require MODEL_PATH . $class . ".class.php";    }else if(substr($clsss, -10) == "Controller"){        require CTRL_PATH . $class . ".class.php";    }}$controller_name = $c."Controller";   //会自动调用__autoload()$ctrl = new controller_name();$a = !empty($_GET['a']) ? $_GET['a'] : 'Index';$active = $a . "Action";$ctrl->$active();    //页面工作开始, 指定页面内容
0 0