Вывод error_log() для print_r() появляется на странице

17 дек. 2017 г., 01:21:49
Просмотры: 32.7K
Голосов: 12

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

error_log( print_r( $variable ) );

Когда я смотрю в debug.log, я вижу только 1, а фактический вывод функции error_log() отправляется в браузер.

Я знаю, что другой плагин не вызывает это, так как все отключены, кроме того, который я пишу. В моем wp-config.php я определил WP_DEBUG_DISPLAY как false.

То же самое происходит, если я использую var_dump() и var_export(). Другие функции, такие как gettype(), работают нормально.

Есть ли способ получить вывод в debug.log?

0
Все ответы на вопрос 3
1
22

Функция print_r принимает второй параметр return, который позволяет вернуть значение переменной вместо его вывода.

print_r($expression, $return)

Таким образом, вы можете сделать следующее:

error_log( print_r( $variable, true ) );
17 дек. 2017 г. 01:36:29
Комментарии

Спасибо. Догадывался, что упускаю что-то настолько простое :)

Cedon Cedon
17 дек. 2017 г. 02:17:09
0

Если ваша переменная является просто строкой, вы можете использовать error_log ( $variable ). Если это объект или массив, помимо использования print_r(), вы также можете сериализовать его:

error_log ( serialize ( $variable ) );
17 дек. 2017 г. 11:15:48
0

Хотя принятый ответ является правильным, я хотел включить ответ, который расширяет объяснение для большей ясности.

print_r() принимает два аргумента (см. документацию по этой функции), второй из которых является необязательным и вы опустили. Первый аргумент — это выражение для вывода. Второй указывает, возвращать значение или выводить его.

Когда второй аргумент опущен, его значение по умолчанию — false, и поэтому результат выводится сразу. Если этот аргумент равен false, print_r() вернет true (что отображается как "1" в журнале ошибок).

$result = print_r( $variable );

Возвращаемый результат здесь — true (отображается как "1").

Вы передаете возвращаемый результат print_r() в error_log(). По причине, описанной выше, этот результат равен "1", и именно поэтому вы получаете 1 в журнале.

Чтобы получить результат, содержащий выражение из $variable, и передать его функции error_log(), вам нужно, чтобы print_r() возвращал выражение как результат. Вы можете сделать это, указав второй аргумент как TRUE.

$result = print_r( $variable, true );

Теперь возвращаемый результат print_r() — это выражение, содержащееся в $variable, и вы можете передать его в error_log():

$result = print_r( $variable, true );
error_log( $result );

ИЛИ:

error_log( print_r( $variable, true ) );

Если вы хотите пойти дальше, вы можете написать служебную функцию для записи в журнал, которая будет определять, является ли $variable массивом или объектом и требует ли print_r(), или может быть просто передана как строка. Это упрощает отладочное логирование, так как вам не нужно заботиться о типе переменной для передачи ее в журнал. Я написал такую служебную функцию с подробным объяснением здесь.

Примечание по упомянутым функциям PHP: Независимо от вашего опыта, всегда полезно пересматривать документацию функций, которые вы используете, чтобы убедиться, что вы знаете, что они на самом деле делают. Я привел ссылку на документацию print_r() выше, где точно описано то, о чем говорится как в этом ответе, так и в принятом. Но также были упомянуты некоторые другие функции PHP, которые работали или не работали. Рассмотрим их:

var_dump(): Документация указывает, что эта функция не возвращает результат. Чтобы передать что-то в error_log() для включения в журнал ошибок, это должно быть выражение, содержащееся в переменной. Эта функция ничего не возвращает, она только выводит на экран. Поэтому вы не можете использовать ее для передачи чего-либо в error_log().

var_export(): Подобна print_r() тем, что у нее есть второй, необязательный аргумент для возврата результата или вывода на экран. Укажите второй аргумент как true, чтобы иметь возможность вернуть результат для error_log().

gettype() всегда возвращает тип переменной. Так что у вас есть что-то, что можно передать в error_log() по умолчанию. Вот почему это сработало.

2 февр. 2020 г. 16:36:57