Echo vs. Print

Há muito mistério e desinformação sobre esta área fundamental do PHP. Todo desenvolvedor de PHP aprende como fazer o texto aparecer em uma página. Normalmente é com a ajuda do echo. Mais tarde eles têm que descobrir o que está realmente dentro de uma variável, e eles são ensinados/descobertos ou print_r() ou var_dump().

Tonight Eu participei de um workshop, onde alguns aspectos do PHP foram ensinados a pessoas novas na linguagem. Estes tipos de workshops são difíceis de dar, porque as pessoas vão fazer perguntas que só pessoas novas fariam, e muitas vezes eles são sobre áreas da linguagem há muito esquecidas ou ignoradas por desenvolvedores PHP experientes.

Um dos participantes perguntou qual era a diferença entre echo e print, e imediatamente eu pensei que tinha certeza da sua função. Depois pensei nas diferenças sutis entre todas as funções de impressão de variáveis, e como elas nunca são realmente explicadas em detalhes. Vamos mudar isso!

echo é uma construção de linguagem que se parece com uma função, mas não é. De acordo com a documentação; ele produz múltiplos parâmetros (string), mas quando eu tento isso ele gera um erro de sintaxe:

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

Seja como for, os parênteses são opcionais:

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

echo não retorna um valor. O seu único trabalho é emitir uma string.

Parece que eu deveria ter tentado várias strings sem os parênteses. Graças àqueles que apontaram isso. ☺

print

Unlike echo; a documentação para impressão afirma corretamente que ele irá emitir uma única string. Também não é estritamente uma função, mas bizarramente irá sempre retornar 1. Como resultado, as seguintes coisas acontecem:

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

Strange. Definitivamente estranho.

print_r

Seguindo estas construções praticamente semelhantes, print_r começa a desenvolver a ideia de saída de uma variável. A idéia por detrás de print_r é de produzir/retornar uma representação legível por humanos de uma única variável:

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

O segundo parâmetro (booleano) de print_r diz ao PHP se deve retornar o valor ou produzi-lo. true significa retorno, false significa output. O padrão é false.

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

print_r irá retornar muitas informações para objetos profundamente aninhados. Quando ele mancha referências recursivas, ele as omitirá, e exibirá *RECURSION*. Você também deve ter notado que há espaços em branco ao redor das partes do output, o que torna o output mais fácil de ler.

var_dump

Simplesmente, var_dump() produz uma representação de uma ou mais variáveis. Como echo, a documentação para var_dump() diz que ela irá lidar com múltiplas variáveis. Ao contrário de echo isto parece ser verdade:

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

var_dump() também mostra dados aninhados, mas instalar a extensão XDebug irá limitar isto a três níveis de profundidade, e requer uma mudança de configuração para mostrar mais novamente.

Esta mudança de configuração do XDebug que você precisa fazer é xdebug.var_display_max_depth=n.

var_dump() não mostra espaços em branco extra, então isto torna difícil a leitura da saída. Adicionalmente, a extensão XDebug irá envolver tudo em elementos HTML (para destaque de sintaxe), então ler a saída var_dump() é um pesadelo na linha de comando.

var_export

var_export() é similar a print_r(), no sentido em que pode sair diretamente, ou retornar uma string. No entanto, a saída/retorno é válida a sintaxe PHP:

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

Você não encontrará frequentemente um bom uso para este método, e quando o fizer você provavelmente retornará (ao invés de retornar) a representação. Quando você passa uma instância para ele, você obtém uma representação bastante estranha:

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

Se esse código fosse analisado; o método __set_state() seria chamado na classe Coisa. Aqui está um exemplo do que você poderia fazer então:

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

Você também deve notar que variáveis de recursos não podem ser exportadas:

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

Isto é ótimo para resolver um problema muito específico; ler, atualizar e escrever arquivos de configuração PHP:

return ;

Isto é de config.php

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

Isto é de update.php

Isto é de config.php

Deixe uma resposta

O seu endereço de email não será publicado.