php序列化与魔术方法

一、序列化与反序列化

1.1 数组的序列化与反序列化

在PHP中,数组和对象无法保存,如果需要保存就要将数组或对象转换成一个序列。
序列化:将数组或对象转换成一个序列(serialize)
反序列化:将序列化的字符串转换成数组或对象。(unserialize)

vv
序列化:

<?php
    $stu=['tom', 'berry', 'ketty'];
    // echo $stu=serialize($stu); // 序列化
    $str=serialize($stu); // 序列化
    file_put_contents('./stu.txt', $str);

    
?>

效果:
在这里插入图片描述


反序列化:

<?php
/*
    $stu=['tom', 'berry', 'ketty'];
    // echo $stu=serialize($stu); // 序列化
    $str=serialize($stu); // 序列化
    file_put_contents('./stu.txt', $str);
    */

    // 数组的反序列化
    $str=file_get_contents('./stu.txt');
    $stu=unserialize($str);
    print_r($stu);


?>

效果:
在这里插入图片描述

1.2 对象的序列化与反序列化

<?php
    class Student {
    
    
        public $name;
        protected $sex;
        private $add;
        public function __construct($name, $sex, $add) {
    
    
            $this->name=$name;
            $this->sex=$sex;
            $this->add=$add;
        }
    }

    // 测试
    $stu=new Student('tom', '男', '北京');
    // 序列化
    $str=serialize($stu);
    file_put_contents('./stu.txt', $str);

?>

效果:
在这里插入图片描述
对象反序列化(序列化反编译的时候需要类的参与):

<?php
    class Student {
    
    
        public $name;
        protected $sex;
        private $add;
        public function __construct($name, $sex, $add) {
    
    
            $this->name=$name;
            $this->sex=$sex;
            $this->add=$add;
        }
    }

    // 测试
    $stu=new Student('tom', '男', '北京');
    // 序列化
    $str=serialize($stu);
    file_put_contents('./stu.txt', $str);

    // 反序列化
    $str=file_get_contents('./stu.txt');
    $stu=unserialize($str);
    var_dump($stu);
?>

效果:
在这里插入图片描述

二、魔术方法

已学魔术方法:
__construct()、 __destruct()、 __clone()

2.1 __tostring()

<?php
    class Student {
    
    
        // 把对象当成字符串使用的时候自动执行
        public function __tostring() {
    
    
            return '我是对象<br/>';
        }
    }
    $stu=new Student;
    echo $stu;
?>

效果:
在这里插入图片描述

扫描二维码关注公众号,回复: 12301952 查看本文章

2.2 __invoke()

<?php
    class Student {
    
    
        // 把对象当成字符串使用的时候自动执行
        public function __tostring() {
    
    
            return '我是对象<br/>';
        }

        // 把对象当成函数使用的时候自动自行
        public function __invoke() {
    
    
            echo '这是一个对象,不是函数';
        }
    }
    $stu=new Student;

    $stu();
?>

效果:
在这里插入图片描述

2.3 __set()、__get()、

__set($k, $v): 给无法访问的属性赋值的时候自动执行。
__get($k):获取无法访问的属性值的时候自动调用。
例:

<?php
    class Student {
    
    
        private $name;
        private $sex;
        private $age;
        // 给无法访问的属性赋值的时候自动执行
        public function __set($k, $v) {
    
    
            $this->$k=$v;
        }

        // 给无法访问的属性赋值的时候自动执行
        public function __get($k) {
    
    
            return $this->$k;
        }
    }
 
    $stu=new Student;
    $stu->name='tom';
    $stu->sex='男';
    $stu->age='18';
    echo $stu->name;
?>

效果:
在这里插入图片描述

2.4 __isset()、__unset()

__isset():判断无法访问的属性是否存在。
__unset():销除无法访问的属性的时候。

例:

<?php
    class Student {
    
    
        private $name;
        private $sex;
        private $age;
        // 给无法访问的属性赋值的时候自动执行
        public function __set($k, $v) {
    
    
            $this->$k=$v;
        }

        // 给无法访问的属性赋值的时候自动执行
        public function __get($k) {
    
    
            return $this->$k;
        }

        // 判断无法访问的属性是否存在
        public function __isset($k) {
    
    
            return isset($this->$k);
        }

        // 消除无法访问的属性
        public function __unset($k) {
    
    
            unset($this->$k);
        }
    }
 
    $stu=new Student;
    $stu->name='tom';
    $stu->sex='男';
    $stu->age='18';
    // echo $stu->name;
var_dump(isset($stu->name));
    unset($stu->age);
print_r($stu);
    
?>

效果:
在这里插入图片描述
应用:

<?php
    class Student {
    
    
        private $name;   // 读写属性
        private $add='中国';  // 只读属性
        private $age;   // 只写属性

        public function __set($k, $v) {
    
    
            if (in_array($k, array('name', 'age'))) {
    
    
                $this->$k=$v;
            }
            else {
    
    
                echo "${k}属性是只读属性<br/>";
            }
        }

        public function __get($k) {
    
    
            if (in_array($k, array('name', 'add'))) {
    
    
                return $this->$k;
            }
            else {
    
    
                echo "{
      
      $k}是只写属性<br/>";
            }
        }
    }
    
    // 测试
    $stu=new Student;
    $stu->name='tom';
    $stu->age=22;
    echo '姓名:'.$stu->name,'<br/>';
    echo '地址:'.$stu->add,'<br/>';
    echo $stu->age;
?>

效果:
在这里插入图片描述

2.5 __call()、__callstatic()

__call():调用无法访问方法时自动执行
__callstatic():调用无法访问的静态方法时自动执行

例:

<?php
    class Student {
    
    
        /**
         * 作用:调用无法访问的方法时自动执行
         * @param $fn_name string 方法名
         * @param $fn_args array 参数数组
         */
        public function __call($fn_name, $fn_args) {
    
    
            echo "{
      
      $fn_name}不存在<br/>";
        }
        // 调用无法访问的静态方法时自动执行
        public static function __callstatic($fn_name, $fn_args) {
    
    
            echo "{
      
      $fn_name}静态方法不存在";
        }
    }

    $stu=new Student;
    $stu->show(10,20);

    // 静态调用
    Student::show();
?>

效果:
在这里插入图片描述

2.6 __sleep()、__wakeup()

__sleep():当序列化的时候自动调用
__wakeup():当反序列化的时候自动调用

例:

<?php
    class Student {
    
    
        private $name;
        private $sex;
        private $add='中国';
        public function __construct($name, $sex) {
    
    
            $this->name=$name;
            $this->sex=$sex;
        }
        /**
         * 序列化的时候自动调用
         * @return array 序列化字段名
         */
        public function __sleep() {
    
    
            return array('name', 'sex'); 
        }

        /**
         * 反序列化的自动调用
         * 
         */
        public function __wakeup() {
    
    
            $this->type='学生';
        }
    }

    // 测试
    $stu=new Student('tom', '男');
    $str=serialize($stu);
    $stu=unserialize($str); 

    // echo $str;
    print_r($stu);
?>

效果:
在这里插入图片描述

在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

猜你喜欢

转载自blog.csdn.net/weixin_44103733/article/details/108869296