Вывод error_log() для print_r() появляется на странице
Я пытаюсь отладить плагин и использую 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
?

Функция print_r принимает второй параметр return
, который позволяет вернуть значение переменной вместо его вывода.
print_r($expression, $return)
Таким образом, вы можете сделать следующее:
error_log( print_r( $variable, true ) );

Хотя принятый ответ является правильным, я хотел включить ответ, который расширяет объяснение для большей ясности.
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()
по умолчанию. Вот почему это сработало.
