Por que get_transient () sempre retorna corda mesmo se o número inteiro for definido?

Estive tentando solucionar o seguinte método por horas agora, e não tenho uma idéia porque sempre retorna uma string, em vez de um número inteiro.

A idéia é retornar uma propriedade de class, se existir, ou um valor transitório, se a propriedade de class não existir (e definir a propriedade de class para o próximo access).

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; } 

A coisa estranha é quando eu chamo isso com um post_id válido, eu vou ter um número inteiro, mas quando ligar sem, eu vou obter uma string.

Assim…
gettype( get_number( 123 ) ) === 'integer'
gettype( get_number() ) === 'string'

Código de trabalho (baseado na resposta de Otto)

 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; } 

Solutions Collecting From Web of "Por que get_transient () sempre retorna corda mesmo se o número inteiro for definido?"

Os transientes são armazenados como opções na tabela wp_options (na maioria dos casos).

Todos os valores das opções são sempre convertidos em strings quando armazenados. A tabela que os mantém possui a coluna de valor de opção definida como longtext e as funções das opções escapam aos valores das seqüências de caracteres ao criar o SQL. Assim, inteiros inteiros serão convertidos em strings.

Uma vez que o PHP é uma linguagem vagamente tipada, as cadeias de caracteres que são inteiros serão autoconvertidas quando forem usadas mais tarde como números inteiros, de modo que geralmente não é um problema.

Observe também que quaisquer valores que não se convertam de forma limpa em string (como arrays ou objects) serão automaticamente serializados e desmarcados quando forem para / do database. As funções subjacentes da opção WordPress controlam isso para você, portanto, não é necessário fazê-lo sozinho. Você pode enviar uma matriz ou object para as funções transitórias e obter o mesmo retorno delas.

O Post meta comporta-se da mesma forma, mas no seu código, quando você obtém do post_meta, você está executando intval através da string, e é por isso que você recupera um número inteiro.