歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 親密接觸:在PHP下實現持久化

親密接觸:在PHP下實現持久化

日期:2017/2/27 9:27:00   编辑:更多Linux
  “持久化”這個概念是筆者在Java中首次接觸到的,通過這個特性,可以將應用程序對象轉化成一系列字節流(這被稱作對象序列化),以適應網絡傳輸或保存。最奇妙的是,被序列化的對象還可以被重新裝配,還原成以前的樣子。這意味著,該機制能自動補償操作系統間的差異。換句話說,一個在Windows系統的機器上被序列化的對象可以通過網絡傳輸到一台Linux系統的機器上准確無誤的重新裝配。“持久化”可以使應用程序對象不受應用程序運行時間的限制——可以將一個對象序列化,然後保存到磁盤上,在再次需要時進行裝配,能圓滿實現一種“持久”效果。    令人興奮的是,PHP也支持這一特性,而且從PHP3就開始支持了,它是通過Serialize()和Unserialize()這兩個函數來實現的。其實,像ASP這樣的開發環境也隱式支持這一特性——在Session或Application對象中保存應用程序對象就是一種持久化的表現,但遺憾的是,ASP並沒有顯式提供這一接口。    在PHP中,幾乎任何類型(這包括Integer、Boolean、Float、Array和Object)的變量都可以被序列化。之所以說“幾乎”,是因為唯獨Resource類型不支持序列化,這完全是因為PHP中的Resource類型其實是指針的緣故。至於String類型,由於它本身就是字節流,所以根本沒有序列化的必要。    下面將介紹Serialize()和Unserialize()兩個函數的用法:    string serialize (mixed value):返回value被序列化後的字節流;  mixed unserialize (string str):返回將str進行裝配後的對象。    下面是這兩個函數的應用實例:    <?php  //class.inc.php文件,用於保存類的信息    //用於測試的用戶信息類  class Userinfo  {  var $username;  var $passWord;  var $datetime;  function Userinfo($username, $password, $datatime)  {  $this -> username = $username;  $this -> password = $password;  $this -> datetime = $datetime;  }  function output()  {  echo "User Information -> <br>";  echo "Username: ".$this -> username."<br>";  echo "Password: ".$this -> username."<br>";  echo "Datetime: ".$this -> username."<br>";  }  }  ?>    <?php  //login.php文件,用於注冊新用戶    //導入類文件  require_once("class.inc.php");    //新建對象  $user = new Userinfo($_POST['username'], $_POST['password'], date("Y-n-j H:i:s"));  //序列化對象  $user = Serialize($user);    //將對象寫入本地數據庫  $con = mysql_connect();  mysql_select_db("test");  mysql_query($con, "INSERT INTO testTable (id, userinfo) VALUES ('1', '$user')");  mysql_close($con);  ?>    <?php  //userinfo.php文件,用於顯示用戶信息    require_once("class.inc.php");    //從數據庫中取出對象  $con = mysql_connect();  mysql_select_db("test");  $result = mysql_query($con, "SELECT * FROM testTable WHERE id=1");  $record = mysql_fetch_assoc($result);  $user = Unserialize($record['userinfo']);  //輸出用戶信息  $user -> output();  mysql_free($result);  mysql_close($con);  ?>    在對象序列化中,最重要的是在“裝配”的頁面中一定要包含該對象的類的定義信息,否則會出現錯誤。當然,上裡只是用於測試,在實際的應用中,為了防止序列化後的對象的內容被更改,一般還要對字節流進行“數字簽名”,在裝配時,再對“簽名”進行驗證,以防止對象信息被非法篡改。




Copyright © Linux教程網 All Rights Reserved