객체 직렬화

객체를 직렬화하기 - 세션의 객체

serialize() 는 PHP에 저장할수 있는 어떠한 값의 바이트스트림 표현을 포함한 문자열을 반환합니다. unserialize() 는 이 문자열을 원래의 변수값을 재생성하는데 사용할수 있습니다. serialize로 객체를 저장하는것은 객체안의 모든 변수들을 저장하는것을 의미합니다. 클래스명을 제외한 객체내부의 메서드는 저장되지 않을 것입니다.

객체를 unserialize() 할수 있도록 하기 위해서는, 해당 객체의 클래스 정의가 필요 합니다. 이 말은, 클래스 A의 객체를 직렬화 하면 클래스 A의 모든 변수들의 값을 포함하는 문자열을 얻게 됩니다. 다른 파일에서 이 문자열을 역직렬화하여 클래스 A의 객체를 만들고자 할때 해당 파일에는 클래스 A가 먼저 정의 되어 있어야 합니다. 이것은 클래스 A의 정의를 파일로 만들어 인클루드 하거나 spl_autoload_register() 를 사용할 수 있습니다.

                  
<?php
// classa.inc:

  class A {
      public $one = 1;

      public 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.
  file_put_contents('store', $s);

// page2.php:

  // this is needed for the unserialize to work properly.
  include("classa.inc");

  $s = file_get_contents('store');
  $a = unserialize($s);

  // now use the function show_one() of the $a object.
  $a->show_one();
?>
                  
                

응용 프로그램이 나중에 응용 프로그램에서 사용하기 위해 개체를 직렬화하는 경우 응용 프로그램 전체에서 해당 개체에 대한 클래스 정의를 포함하는 것이 좋습니다. 그렇게 하지 않으면 클래스 정의 없이 객체가 직렬화 해제될 수 있으며, 그 결과 PHP가 객체에 __PHP_Incomplete_Class_Name 클래스를 제공하게 되며, 이 클래스는 메서드가 없고 객체를 쓸모 없게 만듭니다.

따라서 위의 예에서 $asession_register("a")를 실행하여 세션의 일부가 된 경우 page1.phppage2.php뿐만 아니라 모든 페이지에 classa.inc 파일을 포함해야 합니다.

위의 조언 외에도 __sleep()__wakeup() 메서드를 사용하여 객체의 직렬화 및 직렬화 해제 이벤트에 연결할 수도 있습니다. __sleep()을 사용하면 객체 속성의 하위 집합만 직렬화할 수도 있습니다.