zoukankan      html  css  js  c++  java
  • PHP面向对象04_串行化


    oop04复习

    2014-9-3 10:48:45

    要点:
    --1、克隆对象
    --2、__toString( )
    --3、 __call( )
    --4、自动加载类
    --5、对象串行化

    1、克隆对象以及__clone()方法

    概述:对象属于引用类型,普通的"="号属于引用赋值

    有时可能需要根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰。

    格式:

    $obj = new Class();
    $obj2 = clone $obj;

    但是,当要克隆的对象中有子对象或资源时,克隆会不完整

    魔术方法:__clone()
    当执行clone克隆时会自动调用的方法,主要用于解决对象中特殊属性的复制操作。

    2、__toString( )

    概述:当试图直接echo对象时,会报错。我们可以在类中加上这个方法,会在echo时自动调用

    示例:

     public function __toString(){
         echo "这是一个类.";
     }

    3、 __call( )

    概述:当试图访问对象中不存在的方法时,会报错。我们可以在类中加上这个方法来处理这种情况

    格式:

    mixed __call( string $name , array $arguments )

    第一个参数$name表示方法名
    第二参数$arguments表示调用时的参数列表(数组类型)

    示例:

    public function __call($name,$args){
    echo "您调用的方法{$name}不存在!参数列表:"; var_dump($args); }

    4、自动加载类(__autoload())

    该方法位于类之外.
    当new一个新对象时,程序会试图调用该方法自动包含所需要的文件

    示例:

    function __autoload($classname){
        $name=$classname.".class.php";
        if(file_exists($name)){
            require($name);
            echo "**自动加载了<font color='red'>".$name."</font>类<br>";
        }else{
            die("<font color='red'>".$name."</font>类不存在!");
        }
    }

    5、对象串行化
    对象也是一种在内存中存储的数据类型,他的寿命通常随着生成该对象的程序终止而终止.
    有时候可能需要将对象的状态保存下来,需要时再将对象恢复.
    **串行化(serialize):对象通过写出描述自己状态的数值来记录自己,这个过程称对象的串行化
    串行化返回一个包含字节流的字符串.
    以下两种情况需要将对象串行化:
    01)对象需要在网络中传输时,将对象串行化成二进制串即可.
    02)对象需要持久保存时,将对象串行化后写入文件或数据库.

    **反串行化(unserialize):能够重新把字符串变回php原来的对象值

    Note:串行化一个对象将会保存对象的所有属性变量和类名信息,但是不会保存对象的方法.
    所以,反串行化时需导入原先对象的方法.

    ***** ***** *****

    [**]对象串行化中的魔术方法__sleep( )和 __wakeup( )

    __sleep(): 是执行串行化时自动调用的方法,目的是实现资源类型属性的关闭释放等操作

    Note:sleep方法需要返回一个数组,其中数组中的值是串行化时要保留的属性名

    __wakeup():是在执行反串行化时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源),即再次初始化.


    【示例】

     public function __sleep(){
         //此串行化要保留四个属性
         return array('server', 'username', 'password', 'db');
     }

    【完整示例】

    <?php
    //声明一个Person类,包含三个成员属性和一个成员方法
    class Person {        
        public $name = "zhangsan";         //人的名字
        public $sex = "man";           //人的性别
        public $age = 20;              //人的年龄
        public function say() {          //这个人可以说话的方法, 说出自己的成员属性       
            echo "我的名字:".$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>";
        }
    }
    $person = new Person();     //能过Person类创建一个对象,对象的引用名为$person
    $person_string = serialize($person);  //通过serialize函数将对象串行化,返回一个字符串
    file_put_contents("file.txt", $person_string);  //将对象串行化后的字符串保存到file.txt文件中
    
    //将file.txt文件中的字符串读出来并赋给变量$person_string
    $person_string = file_get_contents("file.txt"); 
    $person = unserialize($person_string);  //进行反串行化操作,形成对象$person。
    $person -> say();        //调用对象中的say()方法,用来测试反串行化对象是否成功
  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/52fhy/p/3969360.html
Copyright © 2011-2022 走看看