객체 일렬화 - 세션 내의 객체
Note: PHP 3에서 객체는 일렬화(serialization)와 비일렬화(unserialization)처리 과정에서 클래스의 구성요소를 잃게 된다. 처리후 이 변수는 더이상 객체 타입 이 아니다. 그래서 클래스와 메소드를 갖지 않는다. 결국은 거의 쓸모 없게 되는것이다 (웃기는 문법을 갖는 배열처럼 바뀌게 된다)
다음 설명은 PHP 4로만 한정되는 내용이다.
serialize()함수는 PHP에 저장할수 있는 값은 뭐든지 바이트-스트림(byte-stream) 대표성을 내포하는 문자열로 돌려준다. unserialize()함수는 이런 문자열을 원래 변수값으로 되돌려준다. serialize를 사용하여 객체를 저장하면 객체 내의 모든 변수 를 저장할 수 있다. 객체 내의 함수들을 저장할 수는 없고, 오직 클래스의 이름만 저장될것이다.
객체를 unserialize()하기 위해서는, 그 객체의 클래스가 선언되어 있어야 한다. 즉, page1.php에서 클래스 A의 객체 $a 가 있고 이것을 일렬화하면, 클래스 A를 참조하는 문자열을 얻게 되고, 이 문자열은 $a에 속해있는 모든 변수값을 포함하게 될것이다. Page2.php에서 이 문자열을 비일렬화하려면, 클래스 A의 $a를 재생성하고, 클래스 A의 선언이 page2.php에 존재해야 한다. 예를 들면 인클루드 파일 안에 클래스 A의 클래스 선언부를 저장하고 page1.php와 page2.php 에서 이 파일을 인클루드 하면 된다.
<?php
// classa.inc:
class A
{
var $one = 1;
function show_one()
{
echo $this->one;
}
}
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a);
// store $s somewhere where page2.php can find it.
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);
// page2.php:
// this is needed for the unserialize to work properly.
include("classa.inc");
$s = implode("", @file("store"));
$a = unserialize($s);
// now use the function show_one() of the $a object.
$a->show_one();
?>
세션을 사용해서 객체를 등록하기 위해 session_register()함수를 사용한다면, 이 객체들은 각 PHP 페이지의 끝에서 자동으로 일렬화되고, 다음 페이지들 각각에서 자동으로 비일렬화된다. 이 객체들이 일단 세션의 일부분이 되면 페이지의 어느 부분에서도 이런 객체가 나타날 수 있다는것을 의미한다.
모든 페이지에서 실제로 이런 클래스를 사용하지 않더라도, 모든 페이지에 등록된 모든 객체의 클래스 선언을 인클루드하도록 한다. 이렇게 하지 않고, 존재하는 클래스 선언부없이 객체가 일렬화되면, 그 객체는 클래스 구성원을 잃게 될것이고 어떤 함수도 갖지 않는 stdClass클래스의 객체가 될것이다. 즉, 그 객체는 쓸모없게 될것이다.
그래서 위 예제코드에서 $a가 session_register("a") 수행하여 세션의 일부분이 되면, page1.php와 page2.php뿐만 아니라 사용중인 모든 페이지에 classa.inc파일을 인클루드해야 한다.