Intereting Posts
Получение трекбэка, даже с отключенными трекбэками Добавьте несколько полей из разных таблиц в сообщение, поля за сообщение находятся в одной строке таблицы Измените запрос сообщений в зависимости от пользователя через bp_before_has_activities_parse_args Скрытие или удаление расширения файла, отображаемого в HTML на странице вложения Заказать сообщения по тегам? пользовательское переупорядоченное меню с выдержкой для выбранных детей в sidebar.php Постоянная ссылка не работает в Apache на Linux Что такое __return_false в фильтрах Какой инструмент доступен в API WordPress для отладки плагина? Как получить список всех перехватчиков текущей темы / плагина? Если категория сообщений – это «автомобили», отображаемое изображение Контактная форма Безопасность Как вы перехватываете запросы страниц в WordPress? Добавление короткого кода в главное меню Тема Customizier sanitize_callback не работает

Почему 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 по всей строке, поэтому вы возвращаете целое число.