日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP之MVC项目实战

發布時間:2024/7/23 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP之MVC项目实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要包括以下內容

  • 類文件自動加載
  • 路徑管理
  • 頁面跳轉
  • 注冊自動加載方法
  • 配置文件系統
  • cookie
  • session
  • 類文件自動加載

    在PHP中使用別的類時,需要載入類文件,如果類很多的話,需要重復寫很多代碼,所以利用__autoload魔法方法實現自動加載

    /*** 自動加載函數** @param $class_name string 需要的類名*/ function __autoload($class_name) { // echo $class_name, ' ';//特例$map = array('MySQLDB' => FRAME_DIR . 'MySQLDB.class.php','Model' => FRAME_DIR . 'Model.class.php');//該數組,將所有的有限的特例,類與類名的映射,完成一個列表//判斷當前所需要加載的類是否是特例類if( isset($map[$class_name])) {//存在該元素,是特例//直接載入require $map[$class_name];}//規律elseif (substr($class_name, -10) == 'Controller') {//控制器require CURR_CONT_DIR . $class_name . '.class.php';} elseif (substr($class_name, -5) == 'Model') {//模型require MODEL_DIR . $class_name . '.class.php';} }

    路徑管理

    項目中,使用常量的形式管理路徑!
    使用絕對路徑!
    盡量自動獲得!

    如果目錄之前進行拼湊,一定會使用到目錄分隔符!(PATH_SEPARATOR,路徑分隔符) ,不同的操作系統對目錄分隔符的支持是不同的!
    windows 支持 \(反斜杠) 和 /(斜杠),默認是反斜杠\。
    linux 支持 / (斜杠)
    因此程序中多見 /斜杠!
    除此,還有一個更好的方法:
    利用 預定義 常量:DIRECTORY_SEPARATOR,目錄分隔符!

    //管理路徑常量 define('DS', DIRECTORY_SEPARATOR);//簡化目錄分隔符名稱長度! define('ROOT_DIR', dirname(__FILE__) . DS);//根 define('APP_DIR', ROOT_DIR . 'app' . DS);//應用程序 define('CONT_DIR', APP_DIR . 'controller' . DS);//控制器 define('CURR_CONT_DIR', CONT_DIR . PLATFORM . DS);//當前控制器 define('VIEW_DIR', APP_DIR . 'view' . DS);//視圖 define('CURR_VIEW_DIR', VIEW_DIR . PLATFORM . DS);//當前視圖 define('MODEL_DIR', APP_DIR . 'model' . DS);//模型路徑 define('FRAME_DIR', ROOT_DIR . 'framework' . DS);//框架路徑

    頁面跳轉

    header(‘Location: url’);
    優勢:在于立即跳轉!
    劣勢:沒有辦法在跳轉前給出提示!

    header功能是,發送響應頭信息!相應頭信息,是相應信息的一部分!通知瀏覽器應該做哪些事情的部分!但是要求,相應頭信息,要先于響應主體(相應信息的其他部分)先被發送到瀏覽器!
    因此,無論如何也是看不到echo的提示:

    因此,編程上建議在使用header函數時,前面不應該有任何的輸出!包含html輸出和phpecho輸出!

    location.href=’url’,javascript
    提示是,樣式不易控!(可以用彈出層)

    但是,js的支持,需要瀏覽器支持才可以!

    meta:Refresh
    refresh 是刷新的意思,可以提供一個秒數,刷新的間隔!
    有需要當前頁面執行結束后才會刷新,因此容易給出提示,包括提示的樣式!

    因此項目中典型的提示跳轉都由 refresh完成!

    格外注意:
    跳轉的代碼執行結束后,腳本是沒有停止的!
    因此,跳轉的代碼后邊強制腳本停止!

    注冊自動加載方法

    利用 系統函數:
    spl_autoload_registser()

    如果需要注冊的是一個函數:直接提供函數名即可
    如果是方法的話:需要給出類或者對象(是否是靜態) 和 方法名!
    此時需要一個數組,使用兩個元素,分別表示
    array(類名或對象,方法名);

    spl_autoload_register(array('Framework', 'itcast_autoload'));

    配置文件系統

    一,增加一個文件,保存配置信息
    二,項目運行時,將配置文件載入,就可以使用配置信息

    增加配置文件
    在app目錄增加一個config子目錄,用于管理配置文件:

    <?php //配置文件return array('database' => array('host'=>'127.0.0.1','port'=>'3306','user'=>'root','pass'=>'root','charset'=>'utf8','dbname'=>'itcast_shop',),//數據庫組'app' => array(),//應用程序項目組'back' => array(),//后臺'front' => array(), );

    載入配置文件
    增加一個框架級別的基礎操作,載入配置信息!
    在framework/Framework.class.php
    增一個方法,在run方法中執行即可!

    考慮獲得數據的變量:
    保證保存配置信息的變量的全局性!使用$GLOBALS

    /*** 載入路徑常量*/private static function loadConfig() {$GLOBALS['config'] = require CONFIG_DIR . 'app.config.php';}

    使用配置信息
    在基礎模型實例化MysQLDB類時需要使用
    framework/Model.class.php

    protected function initLink() {//require './framework/MySQLDB.class.php';// $options = array(// 'host'=>'127.0.0.1',// 'port'=>'3306',// 'user'=>'root',// 'pass'=>'root',// 'charset'=>'utf8',// 'dbname'=>'itcast_shop'// );$this->db = MySQLDB::getInstance($GLOBALS['config']['database']);}

    瀏覽器的技術,可以在瀏覽器上保存數據的一門技術!cookie就是指的是瀏覽器上保存的數據!
    PHP支持cookie技術!php可以向瀏覽器發出指令,從而將數據保存到瀏覽器上!

    瀏覽器負責保存數據,而php負責控制瀏覽器保存那些數據!
    (php在是使用瀏覽器上cookie技術)

    保存在瀏覽器上的cookie數據,可以在瀏覽器每次項服務器請求時,都可以攜帶該數據,向服務器發出請求,此時服務器上的腳本就可以獲得該數據!

    基本使用
    設置cookie變量,增,改,刪
    利用內部函數 setcookie完成
    setcookie(名字,值)

    取得cookie變量,讀
    使用預定義數組變量:$_COOKIE
    該變量內保存所有從瀏覽器請求時所攜帶的cookie數據!
    每個元素就是一個cookie變量數據!下標是名字,值,就是值!

    高級使用
    1,cookie數據只能是字符串數據!
    2. setcookie函數,可以完成增,修改,刪除!
    不存在,則增加,存在則修改!
    刪除,可以采用將值,置空的形式!
    3. cookie變量的失效期
    cookie數據存在有效期的概念:
    默認,臨時cookie。會保存到瀏覽器關閉!
    同時,支持,增加setcookie的第三個參數,來修改cookie變量的有效期。有效期的表示方式,是一個時間戳,表示到哪個時間點,失效!
    php可以通過 time()函數,獲得當前的時間戳,time()增加增量的形式延長cookie時間!

    setcookie('name','test',time()+60*60);

    4,cookie存在有效路徑的概念
    cookie變量是只在當前目錄,及其后代目錄才會生效!

    test/下設置
    test/sub/下可以訪問

    可以更改cookie數據的有效路徑:
    通過setcookie的第四個參數做修改:

    /表示站點根目錄有效!整站有效!

    5,cookie子域名的概念

    cookie是嚴格區分域名的。

    支持在子域名之間是可以共享的:
    利用第五個參數設置

    有效期,有效路徑,有效子域名!

    6,COOKIEcookie_COOKIE是,瀏覽器請求時所攜帶的所有cookie!
    當前設置的在下次使用請求才好用!

    問題
    由于COOKIE似乎逐漸退出歷史舞臺,不再的瀏覽器對于cookie的支持也不一致,所以以后慎用吧。

    session

    場景:
    cookie的問題
    由于是數據本身是在瀏覽器端:
    數據的安全性問題!
    數據總要在請求時攜帶!

    怎么解決,注意保持在瀏覽器的多次請求間共享數據!

    將數據放在服務器端,同時是數據區分瀏覽器,在瀏覽器的多次請求間共享數據!

    在服務器上,為來訪的每臺瀏覽器增加一個數據空間,然后為這些數據空間分配不同唯一的標識!為每個瀏覽器分配一個唯一的標識,該標志應該服務器端數據庫空間的標識應該一一對應
    要求,瀏覽器每次請求時攜帶標識,此時服務器可以獲得標識,利用標識確定數據空間,但卻請求的所有的數據處理,都在當前的確定的空間內完成!

    將服務器分配給瀏覽器的唯一標識存在瀏覽器的cookie內,可以保證瀏覽器每次來時都攜帶!
    服務器為每一個新瀏覽器訪問(沒有確定標識的瀏覽器),確定 標識,和在服務器上生成一個唯一的數據空間!

    基本使用
    直接操作SESSIONsessionsession_SESSION內的一個元素!對元素操作,就是對session數據做操作!

    但是,session技術,包括生產session標識,開辟session數據空間,為瀏覽器分配session標識等等,都需要PHP的session機制支持!
    因此,需要先開啟session的支持,才能操作$_SESSION變量,從而去操作session數據!

    開啟:
    session_start();

    操作:
    $_SESSION;

    session_start();if(isset($_SESSION['is_login']) && $_SESSION['is_login'] =='yes') {//繼續執行} else {die('沒有登陸');}

    基本原理

    瀏覽器端cookie中保存的sessionID:

    當前瀏覽器第一次對服務器發出請求時,服務器不能確定瀏覽器的標識
    會重新生成一個唯一標識,以cookie的形式保存到瀏覽器端!
    其中默認的cookie變量名為:PHPSESSID。
    該cookie標量,也被稱之為 sessionID!

    當瀏覽器擁有了sessionid這個cookie變量后,接下來的請求都會攜帶該ID發出請求:

    服務器的端的是session數據空間
    默認情況下,php,會將保存session數據的空間,生成一個文件來完成!通過文件的名稱來區分屬于哪個ID的!
    默認的被保存在服務器操作系統的臨時目錄內:

    詳細介紹

    自動開啟
    session可以自動開啟!在當前的腳本執行之前,就完成開啟!
    通過php的配置文件,修改即可!
    修改為session.auto_start=1

    注意,在session已經開啟的情況下再開啟,則會觸發錯誤!
    因此常用@session_start();開啟;

    session_start()前的輸出問題
    session_start前也不應該有任何的輸出,因為可能會使用到響應頭信息(類似于header函數)

    $_SESSION的使用
    $_SESSION 變量只能是字符串下標數組,不支持數值下標數組!

    沒有session_start時是沒有$_SESSION的。
    但是語法上可以向一個普通數組一樣處理,此時不會對_SESSION內的數據做保存!

    刪除session
    刪除某個session數據
    unset($_SESSION[‘key’]);

    刪除所有的session數據
    $_SESSION=array();

    注意,不能unset($_SESSION);

    刪除session的文件
    session_destroy()
    session_destroy()只刪除文件,不處理SESSION_SESSION是有值的!

    但是,一旦執行了session_destroy(),則在腳本結束,不會在執行寫操作!

    如何完全刪除一個session?
    將于當前session相關的數據都刪除掉。
    SESSION:unset_SESSION=array()
    session文件: session_destroy();
    cookie中的sessionID: setcookie(‘PHPSESSID’, ‘’, time()-1);

    服務器端session數據的處理

    處理服務器上所保存的session數據的文件
    修改保存目錄

    默認的保存在系統臨時目錄下,windows/temp下:

    可以通過修改 php的配置。session.save_path進行修改!注意,php不能自動創建該目錄,應該由自己創建目錄

    分子目錄保存session文件
    每個session一個session文件,當請求變多時,session文件增多! 分子目錄保存!

    通過 修改 session.save_path完成!可以配置session的子目錄級數,sessionid字符可能性等

    session.save_path="1;e:/php/temp" session.hash_function=0 session.hash_bits_per_character=5

    利用數據庫存儲session

    重寫session的存儲機制!

    session面臨的問題:
    1量大!難管理
    2服務器多,難共享!

    將session數據,放置在數據庫服務器上進行保存管理!(內存)

    將session數據存入到數據庫中!

    分析:
    需要的工作
    提供可以操作數據的功能代碼!(讀,寫,刪除)
    告知php,在需要的時候,調用我們所定義的代碼!

    增加六個session存儲的處理函數(方法)

    <?php//定義六個函數/*** 在session開啟時執行,* 負責完成session存儲所需要資源的初始化工作!*/ function sess_open() {echo 'open<br>';//連接數據庫$link = mysql_connect('127.0.0.1:3306', 'root', 'root');mysql_query('set names utf8');mysql_query('use itcast_shop'); } /*** session_start()時,開啟session時被執行** 負責從當的session記錄中,將session數據讀取出來** @param $sess_id string 當前的sessionID** @return string session的數據,不需要序列化。如果沒有讀到則返回空字符串!*/ function sess_read($sess_id) {echo 'read<br>';//利用 select 查詢$sql = "select sess_data from `session` where sess_id='$sess_id'";$result = mysql_query($sql);if($row = mysql_fetch_assoc($result)) {return $row['sess_data'];} else {return '';} } /*** 在 腳本結束時被執行** 負責,將當前的session數據,同步寫到當前的session記錄中** @param $sess_id string* @param $sess_data string ** @return bool*/ function sess_write($sess_id, $sess_data) {echo 'write<br>';//執行寫數據的操作!//當前session記錄存在則更新sess_data,不存在則插入!$expire = time();$sql = "insert into `session` values ('$sess_id', '$sess_data', $expire) on duplicate key update sess_data='$sess_data', expire=$expire";return mysql_query($sql); }/*** 在調用了 session_destroy()系統函數時,被自動調用!\* 負責的功能時,利用當前id,刪除當前的session記錄!** @param $sess_id string** @return bool*/ function sess_destroy($sess_id) {echo 'destroy<br>';//執行 delete 操作$sql = "delete from `session` where sess_id='$sess_id'";return mysql_query($sql); }/*** 在session_start() 是執行* 負責 刪除所有的垃圾數據** @param $maxlife int 最大的生命周期** @return bool*/ function sess_gc($ttl) {echo 'gc<br>';//$now = time();$last = $now-$ttl;//$sql = "delete from `session` where expire < $last";return mysql_query($sql);} /*** 腳本結束*/ function sess_close() {echo 'close<br>'; // mysql_close();return true; }session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc' );

    利用系統函數,設置session存儲所需要的處理器,為當前定義好的 這六個函數:
    session_set_save_handler();

    增加一個表保存session數據
    保存在文件中變成保存到數據表中!
    一個文件對應 一條記錄
    文件名 某個字段,sessionID
    文件內容 字段,當前session數據

    create table session( sess_id varchar(32) primary key, sess_data text, expire int(11) ) charset=utf8;

    垃圾回收,gc
    如果一條記錄(一個文件)在多久之內,沒有被使用過了,則認為該數據是垃圾!
    默認的時間,是1440s秒。24分鐘!可以通過php的配置:session.gc_maxlifetime=1440
    什么時候執行刪除的動作?
    在session_start()時,有一定的幾率,執行垃圾回收!
    默認是 1/1000 千分之一!
    可以通過php修改:

    session.gc_probability=1; session.gc_divisor=1000;
    • session與cookie的區別與聯系?
      session 的 sessionID存在 cookie內!
    • session數據有效期?原因是什么?
      瀏覽器關閉。
      原因是保存在瀏覽器端的sessionid丟失!
      默認的sessionID的cookie變量是臨時的cookie變量!
    • 如何持久化session?

    持久化sessionID這個cookie變量!

    使用函數:session_id函數得到當前的sessionID!

    setcookie('PHPSESSID',session_id(),time()+3600);

    php還提供一個專門的修改sessionID的cookie變量的函數:
    session_set_cookie_params();設置該cookie變量的選項的

    在表示有效期的第一個參數,是時間周期,而不是時間戳!留意,應該在session-start()之前,就完成cookie選項的設置!
    (類似于 session_set_save_handler一樣)

    session_set_cookie_params('3600'); session_start();

    此外還應該保證,服務器端垃圾判定的時間要與session持久化的時間盡量一致!
    session.gc_maxlifetime = 3600;

    留意,少用!

    • cookie禁用session是否可用?
      session是基于cookie的,因此cookie禁用,session不應該可用!

    如果非要用,也是可以的!
    辦法是:
    url上傳遞sessionID!

    此時,需要修改php的配置達到目的:
    1,開啟對url上傳遞的支持!將僅僅使用cookie傳遞sessionid關閉!

    session.use_only_cookie=0;

    2,增加url上參數

    session.use_trans_id=1;

    此時php就在瀏覽器沒有cookie使用的情況下,可以采用url進行sessionID的傳遞:

    注意,php只會自動在html代碼的a連接的地址上增加url的傳遞SessionID
    php代碼內的url不能自動增加!

    tip:表單請求時,該參數如何傳遞!php會自動增加表單項隱藏域,name=”PHPSESSID” 值為=”session_ID()”

    總結

    以上是生活随笔為你收集整理的PHP之MVC项目实战的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。