Недавно меня попросили написать собственную реализацию функций PHP serialize (), unserialize (). Мои функции должны возвращать идентичные результаты как исходные внутренние функции PHP.
Я добился определенного прогресса с функцией serialize ():
<?php
function serializator($input)
{
$args = count(func_get_args());
if ( $args > 1) { throw new Exception("Serializator function requires exactly 1 parameter. {$args} given"); };
switch ($input) :
case is_array($input) :
$length = count($input);
$str = gettype($input)[0] . ':' . $length . ':{';
foreach ($input as $key => $value):
if (is_array($value)) {
$str .= gettype($key)[0] . ':' ;
$str .= !is_int($key) ? strlen($key) . ':' . '"' . $key . '"' . ';' : $key . ';';
$str .= serializator($value);
}
else {
$str .= gettype($key)[0] . ':' ;
$str .= !is_int($key) ? strlen($key) . ':' . '"' . $key . '"' . ';' : $key . ';';
$str .= gettype($value)[0] . ':' ;
$str .= !is_int($value) ? strlen($value) . ':' . '"' . $value . '"' . ";" : $value . ';';
}
endforeach;
$str .= '}';
break;
case is_object( $input ) :
$str = ucfirst(gettype($input)[0]) . ':' . strlen(get_class($input)) . ':' . '"' . get_class($input) . '"';
$str .= substr(serializator((array)$input), 1);
break;
case is_int( $input) || is_bool($input) || is_null($input) :
$str = gettype($input)[0] . ':' . $input;
break;
case is_string( $input) :
$str = gettype($input)[0] . ':' . strlen($input). ':' . '"' . $input . '"';
break;
case is_float($input) :
$precision = ini_get('serialize_precision');
$str = gettype($input)[0] . ':' . $input;
break;
case is_resource($input):
$str = 'i:0'; // resource is not serializable
break;
default:
return false;
endswitch;
return $str;
}
Но борется с реализацией unserialize (). Кто-нибудь может указать, с чего начать думать или смотреть? 🙂 Спасибо.
Задача ещё не решена.
Других решений пока нет …