Почему get_transient () всегда возвращает строку, даже если целочисленный набор?

Я пытаюсь исправить следующий метод в течение нескольких часов, и у меня нет идеи, почему он всегда возвращает строку, а не целое число.

Идея состоит в том, чтобы вернуть свойство класса, если оно существует, или переходное значение, если свойство класса не существует (и задание свойства класса для следующего доступа).

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'

Рабочий код (на основе ответа Отто)

 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 "Почему get_transient () всегда возвращает строку, даже если целочисленный набор?"

Переходные процессы сохраняются как параметры в таблице wp_options (в большинстве случаев).

Все значения параметров всегда сохраняются в строках. В таблице, в которой они содержатся, есть столбец option_value, определяемый как longtext, а функции опции выходят из строковых значений при создании SQL. Таким образом, простые целые числа будут преобразованы в строки.

Поскольку PHP является свободно типизированным языком, строки, которые являются целыми числами, будут автоконвертированы, когда они впоследствии будут использоваться как целые числа, поэтому это обычно не проблема.

Также обратите внимание, что любые значения, которые не преобразуются чисто в строку (например, массивы или объекты), будут автоматически сериализованы и неэтериализованы при переходе в / из базы данных. Основные функции WordPress обрабатывают это для вас, поэтому нет необходимости делать это самостоятельно. Вы можете отправить массив или объект в функции переходного процесса и получить от них то же самое.

Post meta ведет себя одинаково, но в вашем коде, когда вы получаете от post_meta, вы используете intval по всей строке, поэтому вы возвращаете целое число.