如果unserialize()失败,则为变量赋值

时间:2017-09-02 04:36:23

标签: php

这个问题的解决方案是否比我找到的解决方案更好或更强大?

  $string = "a:1:{s:19:\"is_featured_service\";b:0;}";
  $unserialized_string = @unserialize($string);

  if ($unserialized_string === false){
    $unserialized_string = 'another value';
  }

2 个答案:

答案 0 :(得分:1)

我喜欢这个,因为你不必试图压制错误:

/**
 * Check value to find if it is serialized data.
 *
 * Function borrowed from Wordpress.
 *
 * @param mixed $data Value to check to see if was serialized.
 * @return bool False if not serialized and true if it was.
 */
function is_serialized( $data ) {
    // if it isn't a string, it isn't serialized
    if ( ! is_string( $data ) )
        return false;
    $data = trim( $data );
    if ( 'N;' == $data )
        return true;
    $length = strlen( $data );
    if ( $length < 4 )
        return false;
    if ( ':' !== $data[1] )
        return false;
    $lastc = $data[$length-1];
    if ( ';' !== $lastc && '}' !== $lastc )
        return false;
    $token = $data[0];
    switch ( $token ) {
        case 's' :
            if ( '"' !== $data[$length-2] )
                return false;
        case 'a' :
        case 'O' :
            return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
        case 'b' :
        case 'i' :
        case 'd' :
            return (bool) preg_match( "/^{$token}:[0-9.E-]+;\$/", $data );
    }
    return false;
}

 $string = "a:1:{s:19:\"is_featured_service\";b:0;}";

 $x = is_serialized( $string )
    ? unserialize( $string )
    : 'Some default value';

答案 1 :(得分:1)

如果您不想处理错误,我只会保留@,这似乎就是您所做的。然后将其更改为三元组以使其变小:

$unserialized_string = @unserialize($string) ?: 'another value';