Intereting Posts
Как добавить другого пользователя к этой функции remove_menu? Копирование темы из Localhost to Live не копирует все настройки темы с ней? Изображения не выравниваются правильно Пользовательский тип сообщения больше не показывает код, добавленный кодом? Проблема повторения рукопожатия WordPress Пользовательский файл шаблона таксономии не используется Отладка тем WordPress с помощью Xdebug, выход html в реальном времени Как планировать публикацию автопоста каждые 60 минут? Отображение списка пользовательских сообщений типа сообщения Как вы добавляете <div> вокруг второго уровня меню? Как вставлять видео YouTube в сообщениях без добавления рекомендуемых видео в конце? Безопасно ли разрешать пользователям, не являющимся администраторами, доступ к загрузчику мультимедиа Проверьте, является ли страница = текущая пользовательская страница с помощью короткого кода WooCommerce: прямая регистрация Страница Некоторые блоги в Multisite показывают иероглифы вместо значков шрифтов Fontello

Почему 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; } 

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

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

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

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

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