zoukankan      html  css  js  c++  java
  • 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 "; // 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 "; // 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类的对象呢?

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

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

     

    反序列化自动加载

     

  • 相关阅读:
    java连接常见数据库的连接字符串
    一个用来自动管理大容量表的Sql脚本
    Ibatis2.0使用说明(一)——入门实例篇
    态度决定你的人生高度
    jboss配置入门(二) -JBOSS3.2.3/3.2.6部署及配置修改
    如何在一个工程里面实现不同的功能打入不同的日志文件中【log4net】
    Xsl实践总结(一)
    Xsl实践总结(三)-介绍一款开发XSL不错的IDE(Stylus)
    Xsl实践总结(二)
    教你节省时间 让你个人效率翻三倍
  • 原文地址:https://www.cnblogs.com/hf8051/p/4661904.html
Copyright © 2011-2022 走看看