Procurar

Categorias

Posts recentes

Arquivo

Blog feeds

Bookmarks


Mesclar PHP e HTML - print, echo e outras…
quarta, 28 de fevereiro de 2007

Este é um tema com o qual todos que aprendem PHP tem que conviver desde o início dos estudos. O HTML é a linguagem oficial, o tipo de saída padrão do PHP (text/html), mas há certos detalhes que não devem ser esquecidos. Vou me esforçar para lembrar do que me atrapalhava há alguns anos (ou ainda atrapalha…) e tentar explicar.

As funções print() e echo()

Servem basicamente para a mesma coisa, com algumas diferenças…

  • echo é capaz de receber mais de um parâmetro, mostrando a concatenação dos mesmos.
  • echo tem uma forma abreviada para usar dentro do HTML (<?="abc"?>) .
  • print oferece o modo "heredoc" que permite misturar HTML, variáveis e aspas indistintamente, mas é bem pouco usado.
  • print retorna o valor mostrado. $str = print "teste"; -> imprime e coloca em $str o valor "teste". echo não retorna nada.
  • Ambos são construções da linguagem, portanto podem ser chamados com ou sem os parênteses, mas para enviar mais de um parâmetro para echo, o uso de parênteses é problemático.
  • Veja uma explicação das diferenças entre print e echo (em inglês).
// exemplos válidos
echo("olá");
echo "tamo aí";
// mesclado com HTML (a sintaxe curta
// do PHP deve estar habilitada):
<?=$variavel?> ou <b><?="teste"?></b>

print("olá");
print "tamo aí";
print <<<FINAL
Aqui posso usar aspas de qualquer tipo,
quebras de linha, <b>TAGs</b>, $variaveis e tudo
mais. Para acabar, basta usar a palavra definida
depois de ‘<<<’, numa linha sem espaços adicionais e
terminada por ";"
FINAL;

O uso das aspas simples e duplas

A escolha do tipo de aspas usado com as funções de impressão (print e echo) é fundamental, pois o resultado pode ser bastante diferente.
Com aspas duplas (") podemos usar variáveis e caracteres especiais, como ‘\n’ (para criar uma quebra de linha), já entre aspas simples tudo é literalmente impresso. Veja:

$num = 5;

print "Maria comprou $num tomates";
// imprime:
// Maria comprou 5 tomates

print ‘Maria comprou $num tomates’;
// imprime:
// Maria comprou $num tomates

print "linha 1\nLinha 2";
/* imprime:
linha 1
Linha 2
*/

print ‘linha 1\nLinha 2′;
/* imprime:
linha 1\nLinha 2
*/

// para imprimir quebras de linha com aspas simples ou
// duplas , podemos usar o caracter literal
print "Linha 1
Linha 2
Linha 3";

Para imprimir aspas dentro de aspas

Entre aspas simples podemos usar aspas duplas à vontade - e vice versa. Para usar duplas dentro de duplas ou simples dentro de simples, é preciso ‘escapá-las’ com uma contra-barra (\’ ou \") . Veja aqui.

print "aqui posso usar ‘aspas simples’";
// ou
print ‘aqui posso usar \’aspas simples\'’;
// imprimem:
// aqui posso usar ‘aspas simples’

print ‘mas e as "duplas" ???’;
// ou
print "mas e as \"duplas\" ???";
// imprimem:
// mas e as "duplas" ???

print ‘aqui posso usar ‘aspas simples'’;
// ou
print "mas e as "duplas" ???";
// gerariam um erro

Misturando strings e variáveis

Com as aspas duplas, já vimos que podemos mesclar diretamente, sem concatenação, mas isso deixa de ser verdadeiro para variáveis complexas como elementos de arrays multidimensionais ou propriedades de objetos.

print "veja: $arr[1][’elem’]";
echo "um obj: $obj->prop->prop2";
Os exemplos acima não funcionariam como esperado. Mas existe um meio de contornar isso: o uso dos caracteres ‘{’ e ‘}’ (chaves - apenas entre aspas duplas). Isso é chamado no manual do PHP de sintaxe complexa e pode ser usada com o sinal $ imediatamente antes ou imediatamente depois de ‘{’, assim:
// válidos
print "veja: {$arr[1][’elem’]}";
echo "um obj: {$obj->prop->prop2)";
// ou
print "veja: ${arr[1][’elem’]}";
echo "um obj: ${obj->prop->prop2)";

Com isso podemos evitar muitas concatenações desnecessárias e chatinhas de escrever, poupando tempo no ato de programar. A sintaxe complexa também vale para o modo heredoc, com print().

Mesclar PHP e HTML

Até aqui falamos de PHP, mas como a interface com o usuário é, em quase todos os casos, em HTML, estamos o tempo todo combinando os dois. Qual é a melhor maneira de fazer isso? Bem, a primeira coisa a lembrar é que PHP e HTML são interpretados em níveis diferentes: o PHP no servidor, antes do envio da resposta HTML, que será interpretada (com seus Javascripts, CSS, etc…) pelo browser. Isso equivale a dizer que podemos escrever livermente o HTML/JS/CSS/etc. com PHP, pois quando estes forem renderizados/executados pelo navegador, o PHP já terá cumprido o seu papel e de tudo que estava entre TAGs PHP só restará o que foi impresso.

Veja algumas formas possíveis:

<html>
<head>
<title><?php print "Título da página"; ?></title>
</head>
<body>
Isso é permitido (usar HTML puro interpolado com TAGs PHP) - o div só aparece se a condição no if for verdadeira:
<?php if(getenv(’HTTP_HOST’) == ‘localhost’) { ?>
<div class="home">Estamos em casa!</div>
<?php } ?>
<p>E aqui o modo reduzido, um ‘atalho’ para a função echo(). Imaginemos que $variavel contém algum texto…</p>
<?=$variavel?>
</body>
</html>

Mostramos acima uma forma de mostrar conteúdos sem usar nenhuma função de impressão, a interpolação entre PHP e HTML. Ao passo que encapsulamos a abertura do if em uma TAG PHP e seu fechamento em outra, podemos trabalhar com HTML puro dentro do escopo desse if e esse conteúdo é suprimido se a condição for falsa, mas…

Se queremos, por exemplo, criar uma sequência de links e fazemos uma função para isso, a princípio não podemos usar a interpolação simples, pois isso manda diretamente para a tela. A não ser que usemos as…

Funções de controle de fluxo

Com as funções ob_* do PHP é possível trabalhar com o HTML puro sem enviar diretamente para a tela. Podemos capturar a saída HTML para uma variável. Veja:

<?php
function makeLinks() {
global $files, $siteurl;
ob_start(); // interrompe a saída
 foreach($files as $fname) {
 ?>
 <li class="lin">
 <a href="<?=$siteurl.’/’.$fname?>"><?=$fname?></a>
 </li>
 <?php
 }
// recupera e retorna o que saiu desde ob_start()
return ob_get_clean();
}
?>
<ul>
<?=makeLinks()?>
</ul>

A função acima normalmente seria algo assim:

<?php
function makeLinks() {
global $files, $siteurl;
$ret = "";
 foreach($files as $fname) {
 $ret .= ‘<li class="lin">
 <a href="’.$siteurl.’/’.$fname.’">’.$fname.’</a>
 </li>’;
 }
return $ret;
}
?>
<ul>
<?=makeLinks()?>
</ul>

Eu acho mais vantagem a interpolação por poder editar o HTML num editor no modo visual, sem precisar criar trechos complexos de HTML na munheca. Bem, acho que é isso.

0 Comentários »

Feeds para os comentários nesse post:
TrackBack: http://cauguanabara.blogsome.com/2007/02/28/mesclar-php-e-html-print-echo-e-outras/trackback/

Nenhum comentário

Say something! »















Por favor digite o texto da imagem acima.

lamp! Mapa do site
Mesclar PHP e HTML - print, echo e outras…