Вывод 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() по умолчанию. Вот почему это сработало.