1. 常见的魔术方法:
      _construct(), _destruct(), _sleep(), _wakeup(), _get(), _toString()
      1.1 在对象进行序列化时,如果有_sleep()方法则先执行,没有再执行_seralize等其他方法,
      1.2 序列化serialize()时检查是否有__sleep()并且是先执行sleep()再进行序列化
      1.3 _get() :读取不可访问(protected 或 private)或不存在的属性的值时(变量)
      1.4 _set():在给不可访问(protected 或 private)或不存在的属性赋值时(不常用)
      1.5 call() : 在对象中调用一个不可访问或不存在的方法时,call()会被调用
      1.6 callStatic() : 在静态上下文中调用一个不可访问或不存在的方法时,callStatic会被调用(不常用)。
      与_call()与 _get()方法类似,但_get()是对变量而言,而_call()是对方法函数而言

    construct():创建对象时触发
    destruct() :对象被销毁时触发
    sleep() :在对象被序列化的过程中自动调用,且发生在序列化之前
    wakeup(): 该魔术方法在反序列化的时候自动调用,且发生在反序列化之前 
    get() :用于从不可访问或不存在的属性读取数据
    set() :用于将数据写入不可访问或不存在的属性
    call() :在对象上下文中调用不可访问的方法时触发
    callStatic() :在静态上下文中调用不可访问的方法时触发
    toString():在对象当做字符串的时候会被调用。
    invoke() :当尝试将对象调用为函数时触发

    一些不常用的魔术方法:
    isset():当对不可访问属性调用isset()或empty()时调用
    unset():当对不可访问属性调用unset()时被调用。
    set_state():调用var_export()导出类时,此静态方法会被调用。
    clone():当对象复制完成时调用
    isset() :在不可访问的属性上调用isset()或empty()触发
    unset() :在不可访问的属性上使用unset()时触发


    PHP序列化是将变量或对象转换为可保存或易于传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量或对象使用的过程;相对于java的序列化,java是在序列化过程中将对象转换为字节流的形式,像tobytes()
    简单的理解序列化:就是把一个类的实例变成一个字符串;
    简单的理解反序列化:就是把一个特殊的字符串转换成一个实例。


    1. 1、当不进行序列化时: 在进行类的实例化时,自动调用__construct();在输出对象时,自动调用

    toString();在程序结束时,自动调用destruct();sleep()与wakeup()均与序列化与反序列化

    有关,在此过程不被调用。

    2、当进行序列化时: 在进行类的实例化时,自动调用__construct();在对创建的dog对象进行序列化

    时,自动调用__sleep();echo $serializedDog,输出序列化的dog对象,**在此不再调用

    _toString()**;dog兑现调用eat()方法,然后程序结束,调用__destruct().

    3、在整个过程中,construct()总是在程序的开始调用,destruct()总是在程序的结束调用,这很

    简单,因为,对所有的变量的初始化总是在程序的开始,释放变量总是在程序结束。
    4.

    1. 受private修饰的私有成员,序列化时: \00 [私有成员所在类名] \00 [私有成员]
    2. 受protected修饰的成员,序列化时:\00 * \00 [成员]