php -- 用文本来存储内容,file_put_contents,serialize,unserialize
根據存儲的內容來劃分
字符串:
file_put_contents :將一個字符串寫入文件
語法:int?file_put_contents?(?string?$filename?,?mixed?$data?[,?int?$flags?= 0?[,?resource$context?]] )
參數
filename:要被寫入數據的文件名。
data:要寫入的數據。類型可以是?string,array?或者是?stream?資源(如上面所說的那樣)。
如果?data?指定為 stream 資源,這里 stream 中所保存的緩存數據將被寫入到指定文件中,這種用法就相似于使用?stream_copy_to_stream()?函數。
參數?data?可以是數組(但不能為多維數組),這就相當于?file_put_contents($filename, join('', $array))。
flags:flags?的值可以是 以下 flag 使用 OR (|) 運算符進行的組合。
| FILE_USE_INCLUDE_PATH | 在 include 目錄里搜索?filename。 更多信息可參見?include_path。 |
| FILE_APPEND | 如果文件?filename?已經存在,追加數據而不是覆蓋。 |
| LOCK_EX | 在寫入時獲得一個獨占鎖。 |
context:一個 context 資源。
//沒有使用flag<?php $file = 'people.txt'; // Open the file to get existing content $current = file_get_contents($file); // Append a new person to the file $current .= "John Smith\n"; // Write the contents back to the file file_put_contents($file, $current); ?>
//使用flag <?php $file = 'people.txt'; // The new person to add to the file $person = "John Smith\n"; // Write the contents to the file, // using the FILE_APPEND flag to append the content to the end of the file // and the LOCK_EX flag to prevent anyone else writing to the file at the same time file_put_contents($file, $person, FILE_APPEND | LOCK_EX); ?>
?
?
非字符串
序列化:產生一個可存儲的值(字符串)的表示。即,將對象或者數組等,轉換為可存儲到文件中的類型(字符串)
語法:string?serialize?(?mixed?$value?)
serialize()?返回字符串,此字符串包含了表示?value?的字節流,可以存儲于任何地方。
這有利于存儲或傳遞 PHP 的值,同時不丟失其類型和結構。
想要將已序列化的字符串變回 PHP 的值,可使用?unserialize()。serialize()?可處理除了?resource?之外的任何類型。甚至可以?serialize()?那些包含了指向其自身引用的數組。你正?serialize()?的數組/對象中的引用也將被存儲。
當序列化對象時,PHP 將試圖在序列動作之前調用該對象的成員函數?__sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用?unserialize()?恢復對象時, 將調用?__wakeup()?成員函數。
序列化:
<?php // $session_data 是包含了當前用戶 session 信息的多維數組。 // 我們使用 serialize() 在請求結束之前將其存儲到數據庫中。$conn = odbc_connect ("webdb", "php", "chicken"); $stmt = odbc_prepare ($conn,"UPDATE sessions SET data = ? WHERE id = ?"); $sqldata = array (serialize($session_data), $PHP_AUTH_USER); if (!odbc_execute ($stmt, &$sqldata)) {$stmt = odbc_prepare($conn,"INSERT INTO sessions (id, data) VALUES(?, ?)");if (!odbc_execute($stmt, &$sqldata)) {/* 出錯 */} } ?>?
?
反序列化:unserialize()?對單一的已序列化的變量(字符串)進行操作,將其轉換回 PHP 的值。
語法:mixed?unserialize?(?string?$str?)
str:序列化后的字符串。
若被解序列化的變量是一個對象,在成功地重新構造對象之后,PHP 會自動地試圖去調用?__wakeup()?成員函數(如果存在的話)。
Note:?unserialize_callback_func 指令
如果在解序列化的時候需要實例化一個未定義類,則可以設置回調函數以供調用(以免得到的是不完整的object?“__PHP_Incomplete_Class”)。可通過php.ini、ini_set()?或?.htaccess?定義‘unserialize_callback_func’。每次實例化一個未定義類時它都會被調用。若要禁止這個特性,只需置空此設定。
<?php // 這里,我們使用 unserialize() 裝載來自數據庫的 $session_data 數組中的會話數據。 // 此例是描述 serialize() 的那個例子的補充。$conn = odbc_connect("webdb", "php", "chicken"); $stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?"); $sqldata = array($_SERVER['PHP_AUTH_USER']); if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {// 如果執行出錯或返回錯誤,則初始化為空數組$session_data = array(); } else {// 現在我們需要的是 $tmp[0] 中已序列化的數據。$session_data = unserialize($tmp[0]);if (!is_array($session_data)) {// 出錯,初始化為空數組$session_data = array();} } ?>?
unserialize_callback_func 例子
<?php $serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';// unserialize_callback_func 從 PHP 4.2.0 起可用 ini_set('unserialize_callback_func', 'mycallback'); // 設置您的回調函數function mycallback($classname) {// 只需包含含有類定義的文件// $classname 指出需要的是哪一個類 } ?>?
另
unserialize,將對應的字符串,反過來構造成原來的數據類型
?
?
為什么不是Person類的對象呢?
因為要得到一個類的對象,必須要保證當前類已經被加載。
解決方法:在事先加載對應的類即可。
?
反序列化自動加載
?
?
總結
以上是生活随笔為你收集整理的php -- 用文本来存储内容,file_put_contents,serialize,unserialize的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dell poweredge r210进
- 下一篇: 一次面试引发的思考(中小型网站优化思考)