在php中反序列化函数实现

时间:2016-08-10 07:25:40

标签: php serialization deserialization

最近我被要求编写我自己的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()实现中挣扎。谁能指出从哪里开始思考或寻找? :) 谢谢。

0 个答案:

没有答案