Echo vs. Print

A PHP ezen alapvető területével kapcsolatban sok a rejtély és a félinformáció. Minden PHP-fejlesztő megtanulja, hogyan lehet szöveget megjeleníteni egy oldalon. Általában az echo segítségével. Később rá kell jönniük, hogy valójában mi van egy változóban, és vagy a print_r() vagy a var_dump() funkciót tanítják/felfedezik.

A mai este részt vettem egy workshopon, ahol a PHP néhány aspektusát tanították meg a nyelvvel újonnan ismerkedőknek. Az ilyen workshopokat nehéz megtartani, mert az emberek olyan kérdéseket tesznek fel, amelyeket csak az újak tennének fel, és gyakran a nyelv olyan területeiről szólnak, amelyeket a tapasztalt PHP-fejlesztők már rég elfelejtettek vagy figyelmen kívül hagytak.

A résztvevők egyike megkérdezte, hogy mi a különbség az echo és a print között, és én azonnal eléggé biztosra vettem a funkciójukat. Aztán elgondolkodtam az összes változó nyomtatási függvény közötti finom különbségeken, és azon, hogy ezeket sosem magyarázzák el igazán részletesen. Változtassunk ezen!

Aecho egy nyelvi konstrukció, amely függvénynek néz ki, de nem az. A dokumentáció szerint; több (string) paramétert ad ki, mégis, amikor ezt megkísérlem, szintaktikai hibát generál:

php > echo("foo", "bar", "baz");
PHP Parse error: syntax error, unexpected ',' in php shell code on line 1

Hogyan is van, a zárójelek opcionálisak:

php > echo "foo"; echo("bar");
foobar

aecho nem ad vissza értéket. Egyetlen feladata egy karakterlánc kiadása.

Úgy tűnik, több karakterláncot kellett volna kipróbálnom a zárójelek nélkül. Köszönöm azoknak, akik rámutattak erre. ☺

print

Az echóval ellentétben; a print dokumentációja helyesen állítja, hogy egyetlen karakterláncot ad ki. Szintén nem szigorúan véve függvény, de bizarr módon mindig 1-et ad vissza. Ennek eredményeképpen a következő dolgok történnek:

php > print "foo"; print("bar"); print print print "baz";
foobarbaz11

Fura. Határozottan furcsa.

print_r

A gyakorlatilag hasonló konstrukciókat követve a print_r elkezdi kifejleszteni a változó kiírásának ötletét. A print_r lényege, hogy egyetlen változó ember által olvasható reprezentációját adja ki/vissza:

php > print_r("foo"); print_r(2); print_r(true);
foo21

A print_r második (boolean) paramétere megmondja a PHP-nek, hogy az értéket visszaadja vagy kiadja-e. A true a visszaadást, a false a kiadást jelenti. Az alapértelmezett érték false.

php > echo print_r(, true);
Array
(
=> bar
)

A print_r sok információt fog visszaadni a mélyen beágyazott objektumok esetében. Ha rekurzív hivatkozásokat észlel, akkor azokat kihagyja, és *RECURSION*-t jelenít meg. Azt is észrevehetted, hogy a kimenet egyes részeit szóköz veszi körül, ami megkönnyíti a kimenet olvashatóságát.

var_dump

A var_dump() hasonló módon egy vagy több változó reprezentációját adja ki. Az echo-hoz hasonlóan a var_dump() dokumentációja szerint több változót is kezel. Az echo-val ellentétben ez igaznak tűnik:

php > var_dump("foo", "bar");
string(3) "foo"
string(3) "bar"php > var_dump(new StdClass);
class stdClass#1 (0) {
}

A var_dump() a beágyazott adatokat is megjeleníti, de az XDebug kiterjesztés telepítése ezt három szint mélységre korlátozza, és konfigurációs módosítást igényel, hogy ismét többet jelenítsen meg.

Ezt az XDebug konfigurációs módosítást kell elvégeznie: xdebug.var_display_max_depth=n.

Avar_dump() nem ad ki extra szóközöket, így ez megnehezíti a kimenet olvasását. Ráadásul az XDebug kiterjesztés mindent HTML elemekbe csomagol (a szintaxis kiemeléshez), így a var_dump() kimenetének olvasása rémálom a parancssoron.

var_export

var_export() hasonló a print_r()-hez, abban a tekintetben, hogy közvetlenül adhat ki, vagy egy stringet adhat vissza. A kimenet/visszatérítés azonban érvényes PHP-szintaxis:

php > var_export();
array (
'foo' => 'bar',
)

Nem gyakran találsz jó felhasználási lehetőséget erre a metódusra, és amikor igen, akkor valószínűleg a reprezentációt fogod visszaadni (ahelyett, hogy kimenne). Ha egy példányt adsz át neki, elég furcsa reprezentációt kapsz:

php > $instance = new Thing();
php > $instance->foo = "bar";
php > var_export($instance);
Thing::__set_state(array(
'foo' => 'bar',
))

Ha ezt a kódot elemeznéd; a __set_state() metódust hívnád meg a Thing osztályon. Íme egy példa arra, hogy mit tehetünk ekkor:

class Thing
{
public $foo;
public static function __set_state($state)
{
$thing = new Thing();
$thing->foo = $state;
return $thing;
}
}

Azt is meg kell jegyeznünk, hogy az erőforrásváltozókat nem lehet exportálni:

php > var_export(fopen("http://google.com", "r"));
NULL

Ez egy nagyon speciális probléma megoldására kiválóan alkalmas; a PHP konfigurációs fájlok olvasására, frissítésére és írására:

return ;

Ez a config.php

$config = file_get_contents("config.php");
$config = "world";
file_put_contents(
"config.php",
"return " . var_export($config, true) . ";"
);

Ez az update.php

return array (
'foo' => 'bar',
'hello' => 'world',
);

Ez a config.php

-ból származik.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.