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

來源:互聯網
上載者:User
 “持久化”這個概念是筆者在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);
  ?>
  
  在對象序列化中,最重要的是在“裝配”的頁面中一定要包含該對象的類的定義資訊,否則會出現錯誤。當然,上裡只是用於測試,在實際的應用中,為了防止序列化後的對象的內容被更改,一般還要對位元組流進行“數位簽章”,在裝配時,再對“簽名”進行驗證,以防止對象資訊被非法篡改。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.