> 백엔드 개발 > PHP 문제 > PHP 직렬화 방법은 무엇입니까?

PHP 직렬화 방법은 무엇입니까?

青灯夜游
풀어 주다: 2023-03-11 10:52:02
원래의
6204명이 탐색했습니다.

PHP 직렬화 방법: 1. serialize() 함수, "serialize(value)" 구문을 사용합니다. 2. base64_encode() 함수를 사용합니다. 3. var_export() 함수를 사용합니다. 4. wddx_serialize_value() 함수를 사용합니다.

PHP 직렬화 방법은 무엇입니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

시나리오:

쿠키는 데이터를 복합 형식으로 저장할 수 없으므로 다차원 배열을 직렬화하고 그러나 PHP 버전이 너무 낮고(5.2) json_encode

를 지원하지 않기 때문에 해결 방법(직렬화 및 역직렬화):

1 직렬화 및 역직렬화 기능: 하나만 지원합니다. -차원 배열.객체 지원이 더 좋다고 하는데, json_encode는 객체를 지원하지 않습니다

PHP의 모든 값은 직렬화(Serialize) 함수를 사용하여 저장할 수 있는 문자열로 변환할 수 있습니다. unserialize() 함수는 문자열을 PHP의 원래 값, 즉 역직렬화로 다시 변경할 수 있습니다.

객체를 예로 들어보겠습니다. 객체를 직렬화하면 객체의 모든 변수가 저장되지만 객체의 메소드는 저장되지 않습니다. 또한 개체를 역직렬화하려면 개체의 클래스가 정의되어 있어야 합니다. 클래스 A의 객체를 직렬화하면 객체의 모든 변수 값을 포함하는 클래스 A와 관련된 문자열이 반환됩니다.

다른 파일의 객체를 역직렬화하려면 역직렬화 전에 객체의 클래스를 정의해야 합니다. 이는 클래스를 정의하는 파일을 포함하거나 spl_autoload_register() 함수를 사용하여 달성할 수 있습니다.

serialize() 함수의 구문 형식은 다음과 같습니다.

serialize(mixed $value)
로그인 후 복사

여기서 $value는 직렬화할 변수입니다.

serialize() 함수는 리소스를 제외한 모든 유형을 처리할 수 있습니다. 객체를 직렬화할 때 PHP는 시퀀스 작업 전에 객체의 __sleep() 멤버 함수를 호출합니다. 이를 통해 객체가 직렬화되기 전에 모든 정리 작업을 수행할 수 있습니다. 마찬가지로 unserialize()를 사용하여 객체를 역직렬화하면 __wakeup() 멤버 함수가 호출됩니다.

serialize() 함수를 사용하여 객체를 직렬화한 후 결과 문자열을 파일이나 데이터베이스에 저장한 다음 unserialize() 함수를 사용하여 필요한 경우 문자열을 역직렬화할 수 있습니다.

2, base64_encode 및 base64_decode, 동일한 문제, 다차원은 지원되지 않습니다. 사용하면 base64 인코딩을 사용하면 문자열 길이가 늘어납니다. 이 문제를 극복하려면 gzcompress와 함께 사용할 수 있습니다:

function my_serialize( $obj )
{
  return base64_encode(gzcompress(serialize($obj)));
}

//反序列化
function my_unserialize($txt)
{
  return unserialize(gzuncompress(base64_decode($txt)));
}
로그인 후 복사

3. var_export 및 eval

$look_books = array($aid => array($cid => array('article_name' => $article->articlename, 'chapter_name' => $chapter->chaptername))) + $look_books;
            $look_books = var_export($look_books, true);
            setcookie('look_books', $look_books, $cookieTime, '/', '.dym.com');
로그인 후 복사

은 다차원 배열을 지원하지만 작은 따옴표와 큰 따옴표에는 이스케이프 문자가 있어 eval이 발생한다는 점에 유의해야 합니다. 실패하면 이스케이프 문자를 제거해야 합니다.

stripcslashes() 即可。
로그인 후 복사

4.wddx_serialize_value 및 wddx deserialize

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');
  
//序列化数组
$s = wddx_serialize_value($a);
echo $s;
  
//输出结果(查看输出字符串的源码):<wddxPacket version=&#39;1.0&#39;><header/><data><struct><var name=&#39;a&#39;><string>Apple</string></var><var name=&#39;b&#39;><string>banana</string></var><var name=&#39;c&#39;><string>Coconut</string></var></struct></data></wddxPacket>
  
echo &#39;<br /><br />&#39;;
  
//反序列化
$o = wddx_deserialize($s);
print_r($o);
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )
로그인 후 복사

이런 식으로 xml 태그 자체가 너무 많은 문자를 차지하고 더 많은 메모리를 차지합니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP 직렬화 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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