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. ☺
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
.