Echo vs. Tisk

O této základní oblasti PHP existuje mnoho záhad a dezinformací. Každý vývojář PHP se učí, jak zajistit, aby se na stránce zobrazil text. Obvykle je to pomocí příkazu echo. Později musí zjistit, co je vlastně uvnitř proměnné, a učí se/objevují buď print_r(), nebo var_dump().

Včera jsem se zúčastnil semináře, kde se některé aspekty jazyka PHP učili lidé, kteří s tímto jazykem teprve začínají. Takové workshopy je těžké vést, protože lidé budou klást otázky, které by kladli jen nováčci, a často se týkají oblastí jazyka dávno zapomenutých nebo ignorovaných zkušenými vývojáři PHP.

Jeden z účastníků se zeptal, jaký je rozdíl mezi echo a print, a hned jsem si byl, ač zcela jistý jejich funkcí. Pak jsem se zamyslel nad jemnými rozdíly mezi všemi funkcemi pro tisk proměnných a nad tím, jak nikdy nejsou podrobně vysvětleny. Pojďme to změnit!“

echo je jazyková konstrukce, která vypadá jako funkce, ale není jí. Podle dokumentace; vypisuje více (řetězcových) parametrů, přesto když se o to pokusím, vygeneruje to syntaktickou chybu:

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

Ať je to jak chce, závorky jsou nepovinné:

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

echo nevrací hodnotu. Jeho jediným úkolem je vypsat řetězec.

Zdá se, že jsem měl zkusit více řetězců bez závorek. Děkuji těm, kteří na to upozornili. ☺

print

Na rozdíl od echo; dokumentace k print správně uvádí, že vypíše jeden řetězec. Také to není striktně vzato funkce, ale bizarně vždy vrátí 1. V důsledku toho se dějí následující věci:

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

Podivné. Rozhodně divné.

print_r

Po těchto prakticky podobných konstrukcích začíná print_r rozvíjet myšlenku výstupu proměnné. Myšlenkou print_r je vypsat/vrátit lidsky čitelnou reprezentaci jedné proměnné:

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

Druhý (logický) parametr print_r říká PHP, zda má hodnotu vrátit, nebo vypsat. true znamená vrácení, false znamená vypsání. Výchozí hodnota je false.

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

print_r vrátí mnoho informací u hluboce vnořených objektů. Když si všimne rekurzivních odkazů, vynechá je a zobrazí *RECURSION*. Možná jste si také všimli, že kolem částí výstupu jsou bílé znaky, které usnadňují jeho čtení.

var_dump

Podobně var_dump() vypíše reprezentaci jedné nebo více proměnných. Stejně jako u funkce echo je v dokumentaci k funkci var_dump() uvedeno, že si poradí s více proměnnými. Na rozdíl od echo se to zdá být pravda:

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

var_dump() také zobrazuje vnořená data, ale instalace rozšíření XDebug omezí toto zobrazení na tři úrovně do hloubky a vyžaduje změnu konfigurace, aby se opět zobrazilo více.

Tato změna konfigurace XDebug, kterou budete muset provést, je xdebug.var_display_max_depth=n.

var_dump() nevypisuje navíc bílé znaky, takže to znesnadňuje čtení výstupu. Navíc rozšíření XDebug vše zabalí do elementů HTML (kvůli zvýraznění syntaxe), takže čtení výstupu var_dump() je na příkazovém řádku noční můrou.

var_export

var_export() je podobný funkci print_r() v tom, že může vypisovat přímo nebo vracet řetězec. Výstup/vrácení je však platná syntaxe jazyka PHP:

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

Pro tuto metodu nenajdete často dobré využití, a když ano, pravděpodobně budete vracet (spíše než vypisovat) reprezentaci. Když jí předáte instanci, dostanete docela podivnou reprezentaci:

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

Pokud by byl tento kód rozebrán; metoda __set_state() by byla volána na třídě Thing. Zde je příklad, co byste pak mohli udělat:

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

Měli byste si také uvědomit, že proměnné zdrojů nelze exportovat:

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

To je skvělé pro řešení velmi specifického problému; čtení, aktualizace a zápis konfiguračních souborů PHP:

return ;

To je z config.php

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

Toto je ze souboru update.php

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

Toto je ze souboru config.php

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.