> 백엔드 개발 > PHP 튜토리얼 > PHP 객체 지향 - 객체 직렬화에 대한 자세한 코드 설명 serialize(), __sleep(), __wakeup()

PHP 객체 지향 - 객체 직렬화에 대한 자세한 코드 설명 serialize(), __sleep(), __wakeup()

黄舟
풀어 주다: 2023-03-07 06:20:01
원래의
1817명이 탐색했습니다.

때로는 객체 를 네트워크 에 업로드하고 전송해야 하는 경우도 있습니다. 전송을 용이하게 하기 위해 전체 객체를 바이너리 문자열로 변환한 다음 복원할 수 있습니다. 객체에 도달하면 원본으로 이동합니다. 이 프로세스를 직렬화(직렬화라고도 함)라고 합니다. 이제 자동차를 배로 미국으로 운송하려는 것과 마찬가지로 자동차가 상대적으로 크기 때문에 분해할 수 있습니다. 자동차를 더 작은 부품으로 쪼개서 우리는 이 부품을 바퀴로 미국으로 운송한 다음 이 부품을 다시 자동차에 조립합니다.
평신도의 관점에서 직렬화는 변수가 나타내는 "메모리" 데이터를 "문자열" 데이터 형식으로 변환하고 이를 역직렬화하는 동안 하드 디스크에 유지하는 방법입니다.
객체를 직렬화해야 하는 상황은 두 가지가 있습니다. 첫 번째 상황은 객체가 네트워크를 통해 전송되는 경우이고, 두 번째 상황은 객체가 파일이나 데이터베이스에 기록되는 경우입니다.
직렬화에는 두 가지 프로세스가 있습니다. 하나는 객체를 바이너리 문자열로 변환하는 것입니다. 우리는 serialize() 함수를 사용하여 객체를 직렬화하고, 다른 하나는 역직렬화(Deserialization이라고도 함)로 변환합니다. 객체에서 객체로 변환된 이진 문자열입니다. unserialize() 함수를 사용하여 객체를 역직렬화합니다.
PHP에서 serialize() 함수의 매개변수는 객체 이름이고 반환 값은 문자열입니다. Serialize()가 반환하는 문자열은 일반적으로 객체 정보를 얻기 위해 이 문자열을 구문 분석하지 않습니다. . 반환만 하면 됩니다. 이 문자열은 네트워크의 다른 쪽 끝으로 전송되거나 파일에 저장될 수 있습니다.
PHP의 unserialize() 함수는 객체를 역직렬화하는 데 사용됩니다. 이 함수의 매개변수는 serialize() 함수의 반환 값입니다. 물론 재구성된 객체입니다.
 
객체 직렬화:

  1. 객체 직렬화는 해당 속성 데이터만 "저장"할 수 있으며 메서드는 무시입니다(메서드는 데이터가 아님). )

  2. 객체가 직렬화되면 해당 객체가 속한 클래스의 매직 메서드가 자동으로 호출됩니다. sleep()

객체 역직렬화:

  1. 객체 역직렬화는 실제로 복구 기간 동안 원래 저장된 속성 데이터이므로 이때는 객체의 원래 클래스에 의존해야 합니다. .

  2. 객체가 역직렬화되면 해당 객체가 속한 클래스의 매직 메서드가 자동으로 호출됩니다. wakeup()

모두 직렬화

1.serialize(객체 이름)

지정된 클래스 객체 직렬화 $str =serialize($per) //개체별로 직렬화하고 결과를 $str에 반환
 
직렬화 방법:

$v1 = 123; //这是一个变量,代表任意的内存数据$s1 = serialize( $v1 );  //将任何类型的变量数据,转换为“字符串”
file_put_contents( '要保存的目标文本文件', $s1 );    //将该字符串,保存到一个文件里(就是硬盘数据)
로그인 후 복사

2.unserialize (직렬화 후 반환 값)

역직렬화, 반환 결과는 객체입니다. $per=unserialize($str);

직렬화 방법:

$s1 = file_get_contens( '保存序列化数据的目标文本文件' );    //从一个文件里读出其中的所有字符
$v1 = unserialize($s1);   //将该字符串数据,反序列化转换为变量(数据)
로그인 후 복사

직렬화 및 역직렬화의 예

<?phpclass Person{
    var $name;   
    var $sex;    
    var $age;    

    function construct($name = "", $sex = "", $age = "") {
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;
    }    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }
}$p1 = new Person("张三", "男", 20);$p1_string = serialize($p1);    //把一个对象串行化,返一个字符串
echo $p1_string . "<br>";        
//串行化的字符串我们通常不去解析//将$p1_string存储到文件file.txt中file_put_contents(&#39;./file.txt&#39;, $p1_string);
$p2 = unserialize($p1_string);    //把一个串行化的字符串反串行化形成对象
$p2$p2->say();//下面的做法和上面效果一样
$p3_file = file_get_contents(&#39;./file.txt&#39;); //读取文件
$p3 = unserialize($p3_file); //反序列化
$p3->say();?>
로그인 후 복사

위 예의 출력 결과:

O:6:"Person":3:{s:4:"name";s:4:"张三";s:3:"sex";s:2:"男";s:3:"age";i:20;}我的名字叫:张三 性别:男 我的年龄是:20
로그인 후 복사

부분 직렬화

1.sleep()

무언가를 직렬화합니다. 객체의 일부 속성입니다.

2.wakeup()

역직렬화 시 객체 내용을 초기화(실제로 수정)합니다
PHP5에는 두 가지가 있습니다 매직 메소드, sleep() 메소드 및 wakeup() 메소드. 객체가 직렬화되면 sleep() 메소드가 호출되어 잠자리에 들기 전에 몇 가지 작업을 완료하고 다시 깨어나면 바이너리를 다시 구성합니다. string.object를 사용하면 또 다른 PHP 함수 wakeup()이 자동으로 호출되어 객체가 깨어날 때 수행할 작업을 수행합니다. sleep() 함수는 매개변수를 허용하지 않지만 직렬화해야 하는 속성이 포함된 배열을 반환합니다. 포함되지 않은 속성은 직렬화 중에 무시됩니다. sleep() 메소드가 없으면 PHP는 모든 속성을 저장합니다.

<?class Person{

    var $name;   
    var $sex;    
    var $age;    

    function construct($name = "", $sex = "", $age = "") {
        $this->name = $name;        
        $this->sex = $sex;        
        $this->age = $age;
    }    function say() {
        echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
    }    //指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex
    function sleep() {
        $arr = array("name", "age"); // 此时,属性$sex将被删除!!!

        return($arr);
    }    //重新生成对象时,并重新赋值$age为40
    function wakeup() {
        $this->age = 40;
    }
}$p1 = new Person("张三", "男", 20);//把一个对象串行化,返一个字符串,调用了sleep()方法,忽略没在数组中的属性
$sex$p1_string = serialize($p1);
echo $p1_string . "<br>"; //串行化的字符串我们通常不去解析
$p2 = unserialize($p1_string); //反串行化形成对象$p2重新赋值
$age为40
$p2->say();?>
로그인 후 복사

위 예의 출력은 다음과 같습니다.

O:6:"Person":2:{s:4:"name";s:4:"张三";s:3:"age";i:20;}我的名字叫:张三 性别: 我的年龄是:40
로그인 후 복사

위 내용은 PHP 객체 지향 - 객체 직렬화에 대한 자세한 코드 설명 serialize(), __sleep(), __wakeup()의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿