Ieșirea error_log() pentru print_r() apare pe pagină

17 dec. 2017, 01:21:49
Vizualizări: 32.7K
Voturi: 12

Încerc să depanez un plugin și folosesc error_log() în diverse locuri pentru a vedea ce se întâmplă. Folosesc următoarea metodă:

error_log( print_r( $variable ) );

Când mă uit în debug.log, tot ce văd este 1 și ieșirea efectivă a funcției error_log() este trimisă către browser.

Știu că nu alt plugin cauzează acest lucru deoarece toate sunt dezactivate cu excepția celui pe care îl scriu eu. În fișierul meu wp-config.php, am definit WP_DEBUG_DISPLAY ca false.

Același lucru se întâmplă dacă folosesc var_dump() și var_export(). Alte funcții precum gettype() funcționează perfect.

Există vreo modalitate de a obține ieșirea în debug.log?

0
Toate răspunsurile la întrebare 3
1
22

Funcția print_r acceptă un al doilea parametru pentru return astfel încât returnează variabila în loc să o afișeze.

print_r($expression, $return)

Deci poți face

error_log( print_r( $variable, true ) );
17 dec. 2017 01:36:29
Comentarii

Mulțumesc. Mă gândeam că va fi ceva atât de simplu ce mi-a scăpat :)

Cedon Cedon
17 dec. 2017 02:17:09
0

Dacă variabila ta este doar un șir de caractere, atunci poți folosi simplu error_log ( $variable ). Dacă este un obiect sau un array, pe lângă folosirea print_r(), o poți serializa și:

error_log ( serialize ( $variable ) );
17 dec. 2017 11:15:48
0

Deși răspunsul acceptat este corect, am dorit să includ un răspuns care extinde explicația pentru claritate.

print_r() acceptă două argumente (vezi documentația pentru această funcție), al doilea fiind opțional și pe care l-ați omis. Primul argument este expresia care urmează să fie afișată. Al doilea specifică dacă valoarea este returnată sau afișată.

Când al doilea argument este omis, valoarea sa implicită este false și, prin urmare, afișează rezultatul imediat. Dacă acest argument este false, print_r() va returna true (care este afișat ca "1" în jurnalul de erori).

$result = print_r( $variable );

Rezultatul returnat aici este true (afișat ca "1").

Transmiți rezultatul returnat de print_r() către error_log(). Din motivul descris mai sus, acest rezultat este "1" și de aceea obții 1 ca intrare în jurnal.

Pentru a obține un rezultat care să conțină expresia din $variable și să o transmiți funcției error_log(), trebuie ca print_r() să returneze expresia ca rezultat. Poți face asta specificând al doilea argument ca TRUE.

$result = print_r( $variable, true );

Acum rezultatul returnat de print_r() este expresia conținută în $variable și o poți transmite către error_log():

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

SAU:

error_log( print_r( $variable, true ) );

Dacă dorești să mergi mai departe, poți scrie o funcție utilitară pentru scrierea în jurnal care să determine dacă $variable este un array sau un obiect și, prin urmare, necesită print_r(), sau dacă poate fi transmisă simplu ca un șir de caractere. Acest lucru facilitează gestionarea jurnalului de depanare, deoarece nu trebuie să te preocupe tipul variabilei pentru a o transmite în jurnal. Am scris o astfel de funcție utilitară împreună cu o explicație detaliată aici.

Notă suplimentară despre funcțiile PHP menționate: Indiferent cât de experimentat ești, este întotdeauna util să revezi documentația funcțiilor pe care le utilizezi pentru a te asigura că știi exact ce fac. Am menționat mai sus documentația pentru print_r(), care descrie exact ceea ce s-a discutat atât în acest răspuns, cât și în cel acceptat. Dar au fost menționate și alte funcții PHP care au funcționat sau nu. Să le analizăm:

var_dump(): Documentația indică faptul că această funcție nu returnează un rezultat. Pentru a transmite ceva către error_log() pentru a fi inclus în jurnalul de erori, este necesar să fie o expresie conținută într-o variabilă. Această funcție nu returnează nimic, doar afișează pe ecran. Deci nu o poți utiliza pentru a transmite ceva către error_log().

var_export(): Similar cu print_r() în sensul că ai un al doilea argument opțional pentru a returna un rezultat sau a afișa pe ecran. Definește al doilea argument ca true pentru a putea returna un rezultat pentru error_log().

gettype() returnează întotdeauna tipul variabilei. Deci ai ceva pe care îl poți transmite implicit către error_log(). Acesta este motivul pentru care a funcționat.

2 feb. 2020 16:36:57