为什么即使设置了整数,GET_TRANSPONMENT()也总是返回字符串?

时间:2013-11-12 作者:micadelli

我已经尝试了几个小时修复以下方法的bug,不知道为什么它总是返回字符串而不是整数。

如果存在,则返回一个类属性;如果不存在,则返回一个临时值(并为下一次访问设置类属性)。

public static function get_number( $post_id = null ) {
    // Check if class property already exists
    if ( empty( self::$number ) ) {

        // THIS IS ALWAYS STRING - WHY?
        $number = get_transient( \'my_number\' );

        if ( false === $number && $post_id ) {
            $number = get_post_meta( $post_id, \'my_number\', true );

            if ( \'\' !== $number ) {
                $number = intval( $number );
                // THERE GOES THE INTEGER
                set_transient(\'my_number\', $number, 20 );
            }
        }

        self::$number = $number;
        // Should still be an integer since we\'ve never set any strings to transient
    }

    return self::$number;
}
奇怪的是当我用有效的post_id, 我会得到一个整数,但如果没有,我会得到一个字符串。

所以
gettype( get_number( 123 ) ) === \'integer\'
gettype( get_number() ) === \'string\'

Working Code (based on Otto\'s answer)

public static function get_number( $post_id = null ) {
    // Check if class property already exists
    if ( empty( self::$number ) ) {

        // THIS IS ALWAYS STRING - WHY?
        $number = get_transient( \'my_number\' );

        if ( false === $number && $post_id ) {
            $number = get_post_meta( $post_id, \'my_number\', true );

            if ( \'\' !== $number ) {
                // THERE GOES AN ARRAY OF THE INTEGER
                set_transient(\'my_number\', array( intval( $number ) ), 20 );
                self::$number = intval( $number );
                return intval( $number );
            }
        }

        self::$number = isset( $number[ 0 ] ) ? $number[ 0 ] : \'\';
    }

    return self::$number;
}

1 个回复
最合适的回答,由SO网友:Otto 整理而成

瞬态作为选项存储在wp\\U选项表中(大多数情况下)。

存储时,所有选项值始终转换为字符串。保存它们的表具有定义为longtext的option\\u value列,创建SQL时,option函数将转义为字符串值。因此,裸整数将转换为字符串。

由于PHP是一种松散类型的语言,当整数字符串后来用作整数时,它们将自动转换,因此这通常不是问题。

还请注意,任何不能干净地转换为字符串的值(如数组或对象)在进出数据库时都会自动序列化和取消序列化。底层的WordPress选项函数可以为您处理这个问题,因此无需亲自完成。您可以向瞬态函数发送一个数组或对象,并从中获取相同的内容。

Post meta的行为方式相同,但在代码中,当您从Post_meta获取时,您在字符串中运行intval,这就是为什么返回整数。

结束

相关推荐

Transients API and multisite

我们正在使用Atlas HTML站点地图插件,该插件使用transients API缓存站点地图,调用如下:set_transient( \'dmac_html_sitemap\', $output, 60*60*24*7 ); 现在,我们还有一个多站点设置,我想知道瞬态存储在哪里,WP multisite是否将它们分开。它将选项分开,因为每个站点(博客)都有自己的DB表前缀(例如wp\\U 29\\U选项)。我在某个地方读到,瞬态可以用memcached存储,所以我猜后端存储是可插入的。这个问