解析基于MVC的輕量級PHP框架_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:php如何實現報表類
      原創內容....實現曲線圖,餅圖,柱形圖. 轉貼請注明出處, http://blog.csdn.net/liq330 效果圖: 原代碼如下: ?php class ImageReport { var Image;//圖片對像 var ImageName;//報表名稱 var ImageType;//報表類型 var ImageWidth;//圖片寬 var ImageHeight;//

      做WEB開發已有一年,每次都寫重復的東西, 因此,想自己寫一下框架,以后開發方便.
      本人之前學習asp.NET兩年,JSP半年,可是后來因為工作的原故換成PHP.其實很不喜歡PHP的語法.還有PHP的函數名,每回都忘記..還是喜歡C#和JAVA的語法,哈...不過PHP有PHP的優點,不像ASP.NET那樣封裝了大量的東西,PHP更簡單,更自由吧.還有應該就是PHP的開源組合.
      寫這編文章主要是因為那些東西要寫給別人看,順便發表了.高手看了別笑,菜鳥自己注意辨別,別被我的錯誤觀點誤導.
      文章中的代碼下載
      一.文件結構
      ├ index.php 入口文件
      class 類存放的文件夾
         ├ base.class.php 基類
         ├ error.class.php 錯誤處理類
         ├ parms.class.php 獲取參數類
      control.class.php 控制類
      model.class.php 模型類
      template smartTemplate 類存放文件夾
      db adodb 類存放文件夾
      includes 包含文件類
      ├ defines.inc.php 定義各路徑文件
         ├ frameword.inc.php 框架處理文件
         ├ router.inc.php 路由文件,跟據參數,跳轉不同路徑
      models 模式存放路徑
      views 模版文件保存路徑
      controls 存放控制類的文件夾
      config.php 配置文件
      admin 后臺
      二.簡單類圖
       
       
      三. 入口文件,index.php
      <?php

      define("EXEC",1); //初始化一個常量,保存別的文件必須先有這個入口文件的引用.


      define('PATH_BASE',dirname(__FILE__)); //獲取入口文件的路徑

      define('DS', DIRECTORY_SEPARATOR); //目錄的分隔,’/’ 或’’

      define( 'PATH_ROOT', PATH_BASE ); //站點的跟目錄,跟據你的入品文件存放來定義,如果放在子目錄下,則要做相應修改.如下,
      //把路徑分組

      {parts = explode( DS, PATH_BASE );
      //去除最后一個路徑名

      array_pop( parts );

      define( 'PATH_ROOT', implode( DS, parts
      ) );}

      require_once(PATH_ROOT.DS.'includes'.DS.'defines.inc.php'); //各文件夾的路徑

      require_once(PATH_ROOT.DS.'includes'.DS.'framework.inc.php');

      echo request->Get('a');//參數的獲取GET方法

      request->Post(‘a’);//獲取POST參數

      ?>
       
       
       
       
       
      四. 路徑定義文件 defines.inc.php
      <?php
      /*
      */
      // no direct access
      defined( 'EXEC' ) or die( 'Restricted access' ); //如果單獨執行這個文件,將不能執行

      //站點路徑
      define( 'PATH_SITE', PATH_ROOT );
      //包含文件路徑
      define( 'PATH_INCLUDE', PATH_ROOT.DS.'includes');
      //類文件路徑
      define( 'PATH_CLASS', PATH_ROOT.DS.'class' );
      //配置文件路徑
      define( 'PATH_CONFIG', PATH_ROOT );

      ?>
       
       
      . 框架文件路徑 frameword.inc.php
      f
      <?php

      // no direct access
      defined( 'EXEC' ) or die( 'Restricted access' );

      //load error class
      require_once( PATH_CLASS.DS.'error.class.php'); //包含錯誤處理文件
      //load base class
      require_once( PATH_CLASS.DS.'base.class.php' ); //包含基類文件

      //實例化基類
      load=new Base();

      //實列化請求類 用于獲取GET或POST
      //加截一個自己寫的類的方法
      //把自己寫的類放在class 文件夾下面,文件名的格式為demo.class.php
      //那么類名就為 class demo{}
      //實便化的方式為demo=load->library(‘demo’);
      //調用demo類的Get函數則為 demo->Get(‘參數’);

      request=load->library('params');
      //不同的目錄用不同的URL方式
      require_once( PATH_BASE.DS.'includes'.DS.'router.inc.php' );

      ?>
       
      六. 基類函數包含了常用的功能 base.class.php
       
      <?php

      // no direct access
      defined( 'EXEC' ) or die( 'Restricted access' );

      class Base extends Error
      {

      var path_root ='';
      var path_class ='';
      var path_control ='';

      /*/構造函數
      *@parame path 應用路徑
      *return null
      */
      public function Base()
      {
      this->path_root =PATH_ROOT;
      this->path_class =PATH_CLASS;
      this->path_control=PATH_BASE.DS.'controls';
      }

      //加載模型
      //load model
      function model(name)
      {
      include_once (this->path_model.DS.name.'.php');

      model=null;
      if(model==null)
      {
      model=new name();
      }
      return model;

      }

      //output page
      /*
      *@paramater name file name
      *@paramater data replace
      *
      */
      function view(name,data)
      {
      Template=self::template(file);
      Template->output(data);
      unset(Template);
      }

      //create database connection
      function database()
      {
      iclude_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
      this->db = ADONewConnection();
      this->db->createdatabase = true;
      result = this->db->Connect(self::config('db_host') , self::config('db_user'), self::config('db_password'), self::config('db_database') );
      if(!result)
      {
      die("Could not connect to the database.");
      }else{
      this->db->Execute("set names 'utf8'");
      return this->db;
      }
      }

      //create template
      function template(file)
      {
      include_once (PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php');
      Template = new Smarttemplate(file)
      Template->template_dir=PATH_BASE.self::config('template_dir');
      Template->cache_dir =PATH_BASE.self::config('cache_dir');

      return Template;
      }

      //import class
      function library(className) 
      {
      if(empty(className))
      {
      return null;
      exit();
      }
      else
      {
      require_once(PATH_CLASS.DS.className.'.class.php');
      return new className();

      }
      }

      //return config value
      function config(parameter)
      {
      require_once(PATH_CONFIG.DS.'config.php');

      return CONFIG::Ini()->parameter;

      }

      }


      ?>
       
       
      . 控制器父類control.class.php
       
      <?php
      class Control
      extends Base
      {
      var
      request;
      function Control()
      {
      this->request=this->library('params
      ');
      }

      //
      output page
      /*
      *@paramater name file name
      *@paramater data replace
      *
      */

      function view(name,data='')
      {
      Template=this->template(name.'.html
      ');
      Template->assign('site_root',this->config('site_root
      '));

      Template->assign(
      data);
      Template
      ->output();
      unset(
      Template);
      }

      //
      load model
      function model(
      name)
      {

      include_once (PATH_BASE.DS.'models'.DS.name.'.php
      ');

      if(this->model==
      null)
      {
      this->model=new
      name();
      }
      return this
      ->model;

      }

      }

      ?>
      八. 模型父類 model.class.php
       
      <?php

      class Model extends Base
      {
      var request;
      var db;
      function Model()
      {
      this->request=this->library('params');
      }

      //create database connection
      function database()
      {
      if(this->db!=null)
      {
      return this->db;
      exit;
      }
      include_once (PATH_CLASS.DS.'db'.DS.'adodb.inc.php');
      this->db = ADONewConnection();
      this->db->createdatabase = true;
      result = this->db->Connect(this->config('db_host') , this->config('db_user'), this->config('db_password'), this->config('db_database') );
      if(!result)
      {
      die("Could not connect to the database.");
      }else{
      this->db->Execute("set names 'utf8'");
      return this->db;
      }
      }

      }

      ?>
       
       
      九. 路由文件, router.inc.php
       
      跟據URL,指定到相應的控制器,跟據網站的URL表現形式編寫
      <?php
      // no direct access
      defined( 'EXEC' ) or die( 'Restricted access' );

      //實例化類
      load=new Base();

      //實列化請求類 用于獲取GET或POST
      request=load->library('params');

      //獲取參數
      option=@request->get('option');
      task =@request->get('task');

      //如果未設置文件
      if(empty(option))
      {
      option=load->config('index_router');
      }

      include_once (PATH_BASE.DS.'controls'.DS.option.'.php');

      Control=new option();

      if(empty(task))
      {
      Control->index();
      }
      else
      {
      Control->task();
      }


      ?>
       
       
      十,使用方法
       
      使用方法.
       
      視圖V:在把模板文件放在VIEW文件夾里面.命名方式為,login.html
      控制C:把要怎么處理的文件放在control文件夾里面,
      格式為.demo.php
      class demo extends Control
      {
      function edit()
      {
      data=this->user->issuer();//調用模型
      this->view(‘login’,data);//這個LOGIN為視圖中的login.html文件
      }
      }
      模型 M:把文件放在 model文件夾里面.格式為.user.php
       
      class user extends Model
      {
      function issuer()
      {
      數據庫或底層的操作,返回結果
      }
      }
       
       
       
      自定義類的調用,把類放在Class文件夾下面.格式為session.class.php
      先實例化.
      session=load->library(‘session’);
      然后再調用類中的函數
      session->sessionId();
       
       
      例子:
      如下URL: http://127.0.0.1/com/admin/?option=test&task=getUser (注:這里的URL格式可以在router.inc.php里面修改.同時為了讓不同目錄的地址格式不一樣,比如前臺和后臺,因些,把router.inc.php規則放在了入口文件的includes目錄下面) 則會調用/admin/control/文件夾下面的test.php文件test類的getUser 函數,如果task參數為空,則調用index函數.
      文件:/admin/control/test.php
      <?php
      class test extends Control
      {
      function index()
      {
      }
      function getUser()
      {
      data['user']=this->model('member')->getUser();
      this->view('test',data);
      }
      function reg()
      {
      if(this->model('member')->isUser())
      {
      this->Alert(‘用戶名已存在’); //error類中定義了
      }
      else
      {
      this->model('member')->addUser();
      }
      }
      }
       
      ?>
      如果this->model('member')這個模型經常用到,可以在引用類的構造函數中初始化,不要每次都實例化.如:
      Var member;
      function test()
      {
      this->member=this->model('member');
      }
      這樣,應用的時候只要. this->member ->addUser();
       
       
       
      this->model(‘member’)->getUser();
      為調用入口文件相應目錄下的Models 文件夾下面的member.php文件里面的getUser();函數
      文件:/admin/models/member.php
      <?php
       
      class member extends Model
      {
      function getUser()
      {
      //return this->db->GetOne("select username from user where userId=1");//這種方式處理數據庫
      //this->request->Get(‘test’)
      //this->request->Post(‘test’) 這種方式獲取參數,在父類中已定義
      return 'admin';
      }
       
      //驗證用戶名是否已經存在
      function isUser()
      {
      userName=this->request->Post(‘username’);
      passWord=this->request->Post(‘password’);
      return this->db->GetOne(“select count(*) from user where username=’userName’ and password=’passWord’”);
      }
      }
       
      ?>
       
       
      this->view(‘test’,data);
      顯示視圖,調用/admin/views/test.html文件,用SmartTemplate 類的方式生成 data 為數組
      這部份請查看smartTemplate 類的使用方法
       

      分享:PHP購物車類
      因為需求中只記錄產品的類型,還有編號..比如食物,,然后什么編號,,這樣子.所以沒有記錄產品的數量..要用的自己改進一下就行了. ?php //setcookie(cart,s:26,45,4,4523423|d:17,7,27,26|e:12,13,123,43|f:34); //cartAdd('e','167'); //getProInfo('z'); /

      來源:模板無憂//所屬分類:PHP教程/更新時間:2010-03-15
      相關PHP教程