Echo vs. Print

Jest wiele tajemnic i błędnych informacji na temat tej podstawowej dziedziny PHP. Każdy programista PHP uczy się jak sprawić, aby tekst pojawił się na stronie. Zazwyczaj robi to za pomocą echo. Później muszą się dowiedzieć, co tak naprawdę znajduje się wewnątrz zmiennej, i uczą się albo print_r() albo var_dump().

Dziś wieczorem uczestniczyłem w warsztatach, gdzie niektóre aspekty PHP były nauczane dla osób nowych w tym języku. Tego typu warsztaty są trudne do przeprowadzenia, ponieważ ludzie zadają pytania, które zadawaliby tylko nowi, a często dotyczą one obszarów języka dawno zapomnianych lub ignorowanych przez doświadczonych programistów PHP.

Jeden z uczestników zapytał, jaka jest różnica między echo a print, i od razu pomyślałem, że jestem pewien ich funkcji. Potem pomyślałem o subtelnych różnicach pomiędzy wszystkimi funkcjami drukowania zmiennych i o tym, że nigdy nie są one szczegółowo wyjaśnione. Zmieńmy to!

echo jest konstrukcją językową, która wygląda jak funkcja, ale nią nie jest. Zgodnie z dokumentacją wypisuje ona wiele parametrów (łańcuchowych), ale kiedy próbuję to zrobić, generuje błąd składni:

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

Nawiasy są opcjonalne:

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

echo nie zwraca wartości. Jego jedynym zadaniem jest wyprowadzenie ciągu znaków.

Wydaje się, że powinienem był spróbować wielu ciągów bez nawiasów. Dzięki tym, którzy zwrócili na to uwagę. ☺

print

W przeciwieństwie do echo; dokumentacja dla print poprawnie stwierdza, że wypisuje on pojedynczy łańcuch. Nie jest też ściśle funkcją, ale dziwnym trafem zawsze zwraca 1. W rezultacie, dzieją się następujące rzeczy:

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

Dziwne. Zdecydowanie dziwne.

print_r

Podążając za tymi praktycznie podobnymi konstrukcjami, print_r zaczyna rozwijać ideę wyprowadzania zmiennej. Ideą print_r jest wyprowadzenie/zwrócenie czytelnej dla człowieka reprezentacji pojedynczej zmiennej:

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

Drugi (boolean) parametr print_r mówi PHP, czy zwrócić wartość, czy ją wyprowadzić. true oznacza return, false oznacza output. Domyślnie jest to false.

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

print_r zwróci wiele informacji dla głęboko zagnieżdżonych obiektów. Gdy zauważy odwołania rekurencyjne, pominie je i wyświetli *RECURSION*. Być może zauważyłeś również, że wokół części danych wyjściowych znajdują się białe spacje, które ułatwiają ich czytanie.

var_dump

Podobnie, var_dump() wypisuje reprezentację jednej lub więcej zmiennych. Podobnie jak echo, dokumentacja dla var_dump() mówi, że obsłuży ona wiele zmiennych. W przeciwieństwie do echo wydaje się to być prawdą:

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

var_dump() pokazuje również zagnieżdżone dane, ale zainstalowanie rozszerzenia XDebug ograniczy to do trzech poziomów głębokości i wymaga zmiany konfiguracji, aby pokazać więcej ponownie.

Ta zmiana konfiguracji XDebug, którą będziesz musiał wprowadzić to xdebug.var_display_max_depth=n.

var_dump() nie wypisuje dodatkowych białych znaków, więc utrudnia to czytanie danych wyjściowych. Dodatkowo, rozszerzenie XDebug zawija wszystko w elementy HTML (dla podświetlenia składni), więc czytanie wyjścia var_dump() jest koszmarem w linii poleceń.

var_export

var_export() jest podobna do print_r(), w tym sensie, że może wypisać bezpośrednio lub zwrócić łańcuch. Jednakże, wyjście/zwrot jest poprawną składnią PHP:

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

Nie będziesz często znajdował dobrego zastosowania dla tej metody, a kiedy to zrobisz, prawdopodobnie zwrócisz (raczej niż zwrócisz) reprezentację. Gdy przekażesz do niej instancję, otrzymasz dość dziwną reprezentację:

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

Gdyby ten kod został sparsowany, metoda __set_state() zostałaby wywołana na klasie Thing. Oto przykład tego, co mógłbyś wtedy zrobić:

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

Powinieneś także zauważyć, że zmienne zasobów nie mogą być eksportowane:

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

To jest świetne do rozwiązania bardzo specyficznego problemu; czytania, aktualizowania i pisania plików konfiguracyjnych PHP:

return ;

To jest z config.php

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

To jest z update.php

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

To jest z config.php

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.