PHP3에서 메소드를 직렬화/객체화하기
PHP3 의 serialize()/unserialize() 함수에서 객체의 메소드를 다루면 에러가 발생하게 됩니다. 즉, PHP3의 serialize()/unserialize() 함수가 객체의 메소드를 지원하지 않기 때문입니다. 그래서 PHP3에서도 객체의 메소드를 직렬화/객체화할 수 있는 라이브러리를 작성하여 보았습니다. 이 라이브러리는 향후 세셔너를 업그레이드할 때 사용할 작정입니다. 그러면 PHP3에서도 모든 변수와 함께 객체에 대해서도 온전히 세션 관리할 수 있을 겁니다.
[code php;gutter:false]
<?php
/*
filename : serialize.php (ver.0.0.1)
email : hwooky@phpclass.com
homepage : www.phpclass.com
author : hwooky
*/
/*
사용자 함수:
string serialize3(mixed value, string classname);
mixed unserialize3(string str);
*/
function prvExplodeGroup($str) {
$count = 0;
$prefix = $middle = $suffix = "";
do {
$pos_start = ($pos_start = strpos($str, "{")) ? $pos_start : "NOTHING";
$pos_end = ($pos_end = strpos($str, "}")) ? $pos_end : "NOTHING";
if ((string)$pos_start < (string)$pos_end) {
// "{"로 시작되는 부분
if (0 == $count) {
$prefix = substr($str, 0, $pos_start);
$str = substr($str, $pos_start+1);
} else {
$middle .= substr($str, 0, $pos_start)."{";
$str = substr($str, $pos_start+1);
}
$count++;
} else if ((string)$pos_start > (string)$pos_end) {
// "}"로 시작되는 부분
$middle .= substr($str, 0, $pos_end)."}";
$str = substr($str, $pos_end+1);
$count--;
}
} while ($count);
if ($middle) {
$middle = substr($middle, 0, -1);
$suffix = $str;
} else {
$prefix = $str;
}
return array($prefix, $middle, $suffix);
}
function prvSimplifyObjectString($str) {
$pos = strpos($str, "{");
$prefix = substr($str, 0, $pos);
$val = substr($str, $pos+1, -2);
$suffix = $val;
$str = "";
$count = 0;
do {
list($prefix, $middle, $suffix) = prvExplodeGroup($suffix);
if ($middle)
$str .= $prefix.$count++.";";
} while ($middle);
return $str.$prefix;
}
function serialize3(&$obj, $classname="") {
$str = serialize($obj);
return $classname.";".$str;
}
function unserialize3($str) {
$pos = strpos($str, ";");
$classname = substr($str, 0, $pos);
$val = substr($str, $pos+1);
$obj = unserialize($val);
if ($classname && function_exists($classname)) {
$tobj = new $classname;
$val = prvSimplifyObjectString($val);
$arg = explode(";", $val);
for ($i=0;$i<sizeof($arg);$i+=2) {
$sep = explode(":", $arg[$i]);
$name = substr($sep[2], 1, -1);
if ("user function" != gettype($tobj->$name))
$tobj->$name = $obj->$name;
}
return $tobj;
}
return $obj;
}
?> [/code]
/*
filename : serialize.php (ver.0.0.1)
email : hwooky@phpclass.com
homepage : www.phpclass.com
author : hwooky
*/
/*
사용자 함수:
string serialize3(mixed value, string classname);
mixed unserialize3(string str);
*/
function prvExplodeGroup($str) {
$count = 0;
$prefix = $middle = $suffix = "";
do {
$pos_start = ($pos_start = strpos($str, "{")) ? $pos_start : "NOTHING";
$pos_end = ($pos_end = strpos($str, "}")) ? $pos_end : "NOTHING";
if ((string)$pos_start < (string)$pos_end) {
// "{"로 시작되는 부분
if (0 == $count) {
$prefix = substr($str, 0, $pos_start);
$str = substr($str, $pos_start+1);
} else {
$middle .= substr($str, 0, $pos_start)."{";
$str = substr($str, $pos_start+1);
}
$count++;
} else if ((string)$pos_start > (string)$pos_end) {
// "}"로 시작되는 부분
$middle .= substr($str, 0, $pos_end)."}";
$str = substr($str, $pos_end+1);
$count--;
}
} while ($count);
if ($middle) {
$middle = substr($middle, 0, -1);
$suffix = $str;
} else {
$prefix = $str;
}
return array($prefix, $middle, $suffix);
}
function prvSimplifyObjectString($str) {
$pos = strpos($str, "{");
$prefix = substr($str, 0, $pos);
$val = substr($str, $pos+1, -2);
$suffix = $val;
$str = "";
$count = 0;
do {
list($prefix, $middle, $suffix) = prvExplodeGroup($suffix);
if ($middle)
$str .= $prefix.$count++.";";
} while ($middle);
return $str.$prefix;
}
function serialize3(&$obj, $classname="") {
$str = serialize($obj);
return $classname.";".$str;
}
function unserialize3($str) {
$pos = strpos($str, ";");
$classname = substr($str, 0, $pos);
$val = substr($str, $pos+1);
$obj = unserialize($val);
if ($classname && function_exists($classname)) {
$tobj = new $classname;
$val = prvSimplifyObjectString($val);
$arg = explode(";", $val);
for ($i=0;$i<sizeof($arg);$i+=2) {
$sep = explode(":", $arg[$i]);
$name = substr($sep[2], 1, -1);
if ("user function" != gettype($tobj->$name))
$tobj->$name = $obj->$name;
}
return $tobj;
}
return $obj;
}
?> [/code]
serialize3() 함수를 보면 serialize() 함수에는 없는 두번째 인수를 지정하여야 합니다. 두번째 인수는 객체를 직렬화할 때만 사용되는 인수입니다. 객체 이외의 변수를 직렬화하는 방법은 serialize() 함수와 동일합니다. 객체를 직렬화하려면 첫번째 인수로는 직렬화하려는 객체명을 지정하고, 두번째 인수로는 객체를 생성할 때 필요한 클래스명을 지정합니다. 예를 들어,
[code php;gutter:false]
$obj = new test;
[/code]
위와 같이 생성된 객체를 직렬화하려면
[code php;gutter:false]
serialize3($obj, "test");
[/code]
위와 같이 객체변수와 클래스명을 지정하여 줍니다. 앞 장에서 다루었던 예제를 여기서도 그대로 사용하여 보겠습니다. 앞 장과 다른 점은 serialize.php 라이브러리를 인클루드하는 부분이 추가되었고, seiralize()/unseiralize() 함수 대신에 라이브러리에 있는 seiralize3()/unseiralize3() 함수를 사용하였다는 것입니다. 실행 결과는 PHP4의 경우와 동일합니다.
[code php;gutter:false]
<?php
// 파일명 : test1.php3
require("./serialize.php");
class test {
var $a;
var $b;
function output() {
return "나 함수";
}
}
$obj = new test;
$obj->a = 0;
$obj->b = "나 b";
echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";
$ser = urlencode(serialize3($obj, "test"));
echo "<p><A href=test2.php3?ser=$ser>TEST2.PHP3</A></p>";
?> [/code]
// 파일명 : test1.php3
require("./serialize.php");
class test {
var $a;
var $b;
function output() {
return "나 함수";
}
}
$obj = new test;
$obj->a = 0;
$obj->b = "나 b";
echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";
$ser = urlencode(serialize3($obj, "test"));
echo "<p><A href=test2.php3?ser=$ser>TEST2.PHP3</A></p>";
?> [/code]
[code php;gutter:false]
<?php
// 파일명 : test2.php
require("./serialize.php");
class test {
var $a;
var $b;
function output() {
return "나 함수";
}
}
$obj = unserialize3(stripslashes($ser));
echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";
?>
<p><A href=test1.php3>TEST1.PHP3</A></p> [/code]
// 파일명 : test2.php
require("./serialize.php");
class test {
var $a;
var $b;
function output() {
return "나 함수";
}
}
$obj = unserialize3(stripslashes($ser));
echo "<p>".$obj->a."</p>";
echo "<p>".$obj->b."</p>";
echo "<p>".$obj->output()."</p>";
?>
<p><A href=test1.php3>TEST1.PHP3</A></p> [/code]
serialize.php 라이브러리를 이용할 때도 PHP4 때와 마찬가지로 serialize3() -> unserialize3() 과정을 거친 객체가 정상적으로 복원되었다는 것을 알 수 있습니다.
'phpclass > 클래스활용' 카테고리의 다른 글
{클래스를 사용해야 하나}1.개요 (0) | 2002.09.13 |
---|---|
{객체에 관련된 정보}5.일반적인 사항 (0) | 2000.10.19 |
{객체에 관련된 정보}3.메소드 다루기(PHP4) (0) | 2000.10.19 |
{객체에 관련된 정보}2.Serialize/Unserialize (0) | 2000.10.19 |
{객체에 관련된 정보}1.클래스와 인스턴스 (0) | 2000.10.17 |