php -- 用文本来存储内容,file_put_contents,serialize,unserialize

根据存储的内容来划分

字符串:

file_put_contents :将一个字符串写入文件

语法:int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource$context ]] )

参数

filename:要被写入数据的文件名。

data:要写入的数据。类型可以是 stringarray 或者是 stream 资源(如上面所说的那样)。

如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。

参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join(‘‘, $array))

flags:flags 的值可以是 以下 flag 使用 OR (|) 运算符进行的组合。

Available flags
Flag 描述
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.iniini_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类的对象呢?

因为要得到一个类的对象,必须要保证当前类已经被加载。

解决方法:在事先加载对应的类即可。

反序列化自动加载

时间: 2024-11-05 14:48:27

php -- 用文本来存储内容,file_put_contents,serialize,unserialize的相关文章

关于MFC文本框输入内容的获取 与 设置文本框的内容

八月要开始做界面了<( ̄︶ ̄)/,然而目前只会用MFC╮(╯▽╰)╭ 好吧,言归正传,设置好文本框后,要获取用户输入的内容,可以用: GetDlgItemText() ; 这个函数有两个参数,第一个参数为文本框的ID号,比如IDC_EDIT3,然后用第二个参数存储其内容; 要想设置某文本框的内容,可以用: SetDlgItemText(); 参数类比之前的获取函数:

vb.net机房收费 &amp; Register文本框为空提示,一键清空文本框所有内容

已经第二次机房收费系统重构了,一遍当然得有一遍的效果,正如对于文本框为空的提示方法,回顾第一遍机房,那些傻里傻气的If语句让自己对代码的亲和度大打折扣啊!那么到底有什么办法解决那些重复性的判断呢?这时候我们就要提到所谓的Model窗体了.在Model窗体中,建立一个封装数组,当窗体中需要判断大量文本框为空的时候,只需简单的调用即可. 新建一个Model类,来存放公共需要的部分. 1.定义一个结构体Term,且用结构体封装一个数组 Public Structure Term '定义结构体term

微信学习总结 06 文本消息的内容长度限制揭秘

1 文本消息的内容长度限制揭秘 理解页面 字符集设置,避免乱码. 2. 具体实现 刘峰博主的博文已经分析的很清楚了,直接去看就行了 .http://blog.csdn.net/lyq8479/article/details/8967824 资料参考: https://mp.weixin.qq.com/wiki http://blog.csdn.net/lyq8479/article/details/8967824

jQuery实现点击文本框清除内容代码实例

jQuery实现点击文本框清除内容代码实例:本章节介绍一下文本框最简单的一个人性化措施,就是点击文本框的时候能够删除里面的提示文本.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title&g

实现文本框输入内容提示代码实例

实现文本框输入内容提示代码实例:比较人性化的网站一般都是比较讲究细节的,比如文本框输入内容具有提示效果,在默认情况下,文本框有提示文本,当鼠标放入文本框输入文本的时候,提示文本会消失,下面就通过代码实例介绍一下如何实现此效果.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="ht

c#快速清除所有文本框中内容

c#快速清除所有文本框中内容 如何清除Form中所有的文本框内容?分两种情况:(1)当所有的文本框都是顶级控件,即它们都直接位于this.Controls(或groupBox.Controls)中,此时遍历一遍清除即可.(2)当文本框不全处于顶级,即部分包含在某些容器控件内,如groupBox中,由于控件在窗体中是严格分级摆放的.此时的文本框有的位于this.Controls中(即Form控件集中),有的则位于groupBox.Controls中. 对于(1),直接这样写就可: //或为grou

Textarea 单击鼠标 清除默认字/点击文本域 默认内容消失/点击文本框 删除预置内容

Textarea 单击鼠标 清除默认字/点击文本域 默认内容消失/点击文本框 删除预置内容. Textarea 单击鼠标 清除默认字 点击文本域 默认内容消失 点击文本框 删除预置内容 在留言框.搜索栏或者Email订阅栏中有一段默认的文本,比如“请输入您的内容”,如果你在其中点击(窗体获取焦点),这段默认的文本就会自动消失. 第一步:添加代码方式: <head> …. <script type=”text/javascript”> function clearDefault(el

Beyond Compare查看合并文本后相同内容的方法

Beyond Compare是一款非常受大家欢迎的文件对比工具,它可以把不同版本的同一个文件或文件夹进行合并,然后输出一个文件或文件夹,并用颜色编码标出一些有差异的地方.但是一些用户如果想忽略差异的部分,直接看相同的部分怎么办.下面我们就来给大家分享一下Beyond Compare查看合并文本后相同内容的方法? 原文:http://www.beyondcompare.cc/jiqiao/xiangtong-neirong.html 具体操作步骤如下所示 步骤一:打开Beyond Compare软

[转]grep 在文本中查找内容

转自: http://www.lampweb.org/linux/3/27.html 功能:grep系列是Linux中使用频率最高的文本查找命令.主要功能在一个或者多个文件中查找特定模式的字符串.如果该行有匹配的字符串,则输出整个行的内容.如果没有匹配的内容,则不输出任何内容.grep命令不改动源文件.Linux的grep家族包括grep.egrep.fgrep.rgrep.grep可以通过-G.-E.-F命令行选项来使用egrep和fgrep的功能. 语法:grep [选项] PATTERN