Există mult mister și dezinformare cu privire la acest domeniu fundamental al PHP. Fiecare dezvoltator PHP învață cum să facă să apară un text pe o pagină. De obicei, o face cu ajutorul lui echo. Mai târziu trebuie să-și dea seama ce se află de fapt în interiorul unei variabile, și sunt învățați/descoperiți fie print_r(), fie var_dump().
Aseară am participat la un workshop, unde unele aspecte ale PHP au fost predate persoanelor noi în acest limbaj. Aceste tipuri de ateliere sunt greu de ținut, pentru că oamenii vor pune întrebări pe care numai cei noi le-ar putea pune și, de multe ori, acestea se referă la zone ale limbajului demult uitate sau ignorate de dezvoltatorii PHP experimentați.
Unul dintre participanți a întrebat care este diferența dintre echo și print, și imediat m-am gândit destul de sigur de funcția lor. Apoi m-am gândit la diferențele subtile dintre toate funcțiile de tipărire a variabilelor și la modul în care acestea nu sunt niciodată explicate cu adevărat în detaliu. Haideți să schimbăm asta!
echo este o construcție de limbaj care arată ca o funcție, dar nu este. Conform documentației; ea scoate mai mulți parametri (șiruri de caractere), dar când încerc acest lucru generează o eroare de sintaxă:
php > echo("foo", "bar", "baz");
PHP Parse error: syntax error, unexpected ',' in php shell code on line 1
Cu toate acestea, parantezele sunt opționale:
php > echo "foo"; echo("bar");
foobar
echo nu returnează o valoare. Singura sa sarcină este să scoată un șir de caractere.
Se pare că ar fi trebuit să încerc mai multe șiruri de caractere fără paranteze. Mulțumesc celor care mi-au semnalat acest lucru. ☺
În mod diferit de echo; documentația pentru print afirmă corect că va emite un singur șir de caractere. De asemenea, nu este strict o funcție, dar în mod bizar va returna întotdeauna 1. Ca urmare, se întâmplă următoarele lucruri:
php > print "foo"; print("bar"); print print print "baz";
foobarbaz11
Straniu. Categoric ciudat.
print_r
După aceste construcții practic similare, print_r începe să dezvolte ideea de a scoate o variabilă. Ideea din spatele print_r este de a ieși/restitui o reprezentare lizibilă pentru oameni a unei singure variabile:
php > print_r("foo"); print_r(2); print_r(true);
foo21
Al doilea parametru (boolean) al print_r îi spune lui PHP dacă trebuie să returneze valoarea sau să o scoată. true înseamnă retur, false înseamnă ieșire. Valoarea implicită este false.
php > echo print_r(, true);
Array
(
=> bar
)
print_r va returna o mulțime de informații pentru obiectele adânc înglobate. Când depistează referințe recursive, le va omite și va afișa *RECURSION*. Este posibil să fi observat, de asemenea, că există spații albe care înconjoară părți ale ieșirii, ceea ce face ca ieșirea să fie mai ușor de citit.
var_dump
În mod similar, var_dump() scoate o reprezentare a uneia sau mai multor variabile. Ca și echo, documentația pentru var_dump() spune că va gestiona mai multe variabile. Spre deosebire de echo, acest lucru pare să fie adevărat:
php > var_dump("foo", "bar");
string(3) "foo"
string(3) "bar"php > var_dump(new StdClass);
class stdClass#1 (0) {
}
var_dump() afișează, de asemenea, date imbricate, dar instalarea extensiei XDebug va limita acest lucru la trei niveluri de adâncime și va necesita o modificare a configurației pentru a afișa din nou mai multe.
Această modificare de configurare XDebug pe care va trebui să o faceți este xdebug.var_display_max_depth=n.
var_dump() nu afișează spații albe suplimentare, astfel încât acest lucru face dificilă citirea rezultatului. În plus, extensia XDebug va înfășura totul în elemente HTML (pentru evidențierea sintaxei), astfel încât citirea ieșirii var_dump() este un coșmar în linia de comandă.
var_export
var_export() este similar cu print_r(), în sensul că poate ieși direct sau poate returna un șir de caractere. Cu toate acestea, ieșirea/restituirea este o sintaxă PHP validă:
php > var_export();
array (
'foo' => 'bar',
)
Nu veți găsi adesea o utilizare bună pentru această metodă, iar atunci când o veți face, probabil că veți returna (mai degrabă decât ieși) reprezentarea. Când îi treceți o instanță, veți obține o reprezentare destul de ciudată:
php > $instance = new Thing();
php > $instance->foo = "bar";
php > var_export($instance);
Thing::__set_state(array(
'foo' => 'bar',
))
Dacă acest cod ar fi analizat; metoda __set_state() ar fi apelată pe clasa Thing. Iată un exemplu de ceea ce ați putea face atunci:
class Thing
{
public $foo;
public static function __set_state($state)
{
$thing = new Thing();
$thing->foo = $state;
return $thing;
}
}
De asemenea, trebuie să rețineți că variabilele resursă nu pot fi exportate:
php > var_export(fopen("http://google.com", "r"));
NULL
Acest lucru este excelent pentru a rezolva o problemă foarte specifică; citirea, actualizarea și scrierea fișierelor de configurare PHP:
return ;
Acesta este din config.php
$config = file_get_contents("config.php");
$config = "world";
file_put_contents(
"config.php",
"return " . var_export($config, true) . ";"
);
Aceasta este din update.php
return array (
'foo' => 'bar',
'hello' => 'world',
);
Aceasta este din config.php
.