New question

Question:

Date: 29-04-2018 15:44:24 (In Spanish)

Tutorial » Preguntas frecuentes sobre el echo[Resolved]

1. ¿A quién va dirigido esta Preguntas frecuentes sobre el echo?




FAQ: Frequently Asked Questions (Preguntas más frecuentes)


El tema quizá pueda parecer trivial... ¿Un FAQ del echo? Sin embargo, éste aunque va dirigido primordialmente a principiantes, también puede ser aprovechado por usuarios experimentados que hayan adquirido ciertos vicios en la programación con PHP (algo bastante usual) o que quieran profundizar sus conocimientos sobre esta herramienta absolutamente básica del lenguaje.

Por tanto, esperando que sea de utilidad para todos, daremos un amplio repaso a esta instrucción estableciendo algunos conceptos que pudieran ser en un futuro fruto de problemas y errores en tus scripts.

Gran parte de los errores sintácticos cometidos en PHP se deben a una mala concatenación de strings, a no introducir los códigos de escape para determinados caracteres... sin ir más lejos: ¿Cuántos errores has sufrido debido a una sintaxis incorrecta del string para un query MySQL?

Este FAQ se entiende como una guía y no como una norma estricta, se aceptará cualquier sugerencia o añadido para completar posibles omisiones.

2. ¿Echo o no echo?

Para ilustrar este punto hemos de recordar aspectos básicos en el aprendizaje de PHP.
PHP es un lenguaje server-side (al menos en su aplicación para la programación web).
Nuestro código PHP es digerido por el servidor, interpretado y se devuelve al cliente como HTML puro que el navegador es capaz de entender.

Es muy común ver código de esta forma:

<?
if (isset($_POST['enviar'])) {
    echo "var1: ".$_POST['var1']."<br />";
    echo "var2: ".$_POST['var2']."<br />";
}
else {
   echo "<form name=\"formulario\" method=\"POST\"   action=\"".$_SERVER['PHP_SELF']."\">
   <input type=\"text\" name=\"var1\">
   <input type=\"text\" name=\"var2\">
   <input type=\"submit\" name=\"enviar\" value=\"Enviar\">
   </form>";
}
?>


Cada línea de este script es interpretada por PHP, los echos arrojan el resultado al navegador, si se ha entrado en la estructura de control del else.

Sin embargo, por la propia naturaleza de la web, el código HTML no necesita ser parseado de ninguna manera, como acabamos de decir PHP lo único que hace al final es entregar HTML al cliente.
¿Para qué parsear echos que solo contienen HTML? Con el concepto básico de server-side también aprendimos que PHP es un lenguaje embebido en el código HTML y que los tags <?php y ?> sirven para abrir y cerrar el "modo" PHP.

Apliquemos lo que hemos aprendido

 <?
  if (isset($_POST['enviar'])) {
     echo "var1: ".$_POST['var1']."<br />";
     echo "var2: ".$_POST['var2']."<br />";
  }
 else {  ?>

   <form name="formulario" method="POST" action="<?=$_SERVER['PHP_SELF']?>">
      <input type="text" name="var1">
      <input type="text" name="var2">
      <input type="submit" name="enviar" value="Enviar">
  </form>

<? } ?>


Este código es mucho más claro, limpio y rápido, ahorramos al preprocesador un montón de líneas a interpretar, que de cualquier modo iban a ser código HTML.

echo como cualquier otra operación de entrada/salida que sucede en nuestro ordenador es lento por naturaleza.
El else anterior se respeta de cualquier forma, y lo que se muestra es el código contenido en él, tanto en modo PHP como no.
Esta práctica aumenta la legibilidad y disminuye la carga del procesador: el parseador simplemente "ignora" las líneas y las arroja tal cual.

De cada cual depende si es oportuno o no abrir y cerrar constantemente los tags para cualquier código HTML. A lo mejor no merece la pena hacerlo para una sola línea:

<?
 echo "<a href=\"pagina.php\">".$link."</a>";
?>


Otro problema que se nos plantea es la inserción de variables de PHP dentro de un código HTML.

Lo normal es encontrarse:


 <?
 // Código PHP por aquí
 ?>
<form name="formulario" method="POST" action="<?=$_SERVER['PHP_SELF']?>">
.
.
.
<?
  // Más código por aquí
?> 


donde

<?=$variable?> equivale a <? echo $variable; ?>.

Esta estructura funciona también para dar salida a lo que devuelve una función e incluso operaciones aritméticas:

 
<table>
 <tr>
   <td>
   Dentro de una hora será: <?=date("j-n-y",time()+3600)?>
  </td>
 </tr>
</table>

Ó
<div>
  <?=nl2br($_POST['textarea'])?>
</div>


Todo esto sólo será válido cuando la directiva "short_open_tag" esté a "on" en nuestro php.ini (es normal encontrarla así en casi cualquier sitio). En caso de que no estuviera tendríamos que poner <?php para abrir el tag, y <?=$variable?> ya no funcionaría. Nuestra única alternativa sería poner:

<form name="formulario" method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>">


También nos veremos forzados al uso de la forma larga de apertura del tag cuando trabajemos con documentos XML.

En general, y aunque short_open_tag está casi siempre habilitado, <?php es la única forma todoterreno para escapar del "modo HTML" independientemente de la configuración del servidor.

Una última cosa acerca del tag de apertura, cuando usemos <?php tenemos que dejar obligatoriamente un espacio antes de introducir una instrucción, cosa que no sucede con los tags abreviados:

<?phpecho "Hello world\n";?> 

Esto fallará.
<?echo "Hello world\n";?> 

Sin embargo, esto no.

3. Diferencias entre echo y print()

A pesar de lo que siempre se oye, (que echo no es una función y print sí) tanto echo como print no son funciones propiamente dichas, sino construcciones del lenguaje.

De todas formas lo que sí es cierto es que a todos los efectos, print se comporta como una función, y echo no.

¿Qué se desprende de esto que nos pueda ser útil? : Print, al comportarse como una función devuelve un valor: 1 (o true) SIEMPRE. De esta forma podremos evaluar print dentro de estructuras más complejas, lo que podría ser de utilidad en algunos casos.

Ejemplos de uso de print en evaluación de expresiones :

<?
$array=file("archivo.txt") or print "No he podido abrir el archivo";

if (isset($variable) && print "variable seteada") { }
// Nótese que el print solo se evaluaría cuando la variable estuviera seteada, ya que AND necesita
// que ambos miembros sean ciertos 1 AND 1 para validar la condición. Con lo que si isset($variable)
// no se cumple, no imprimiremos nada (debido a que 0 AND X siempre es 0)

$array=file("archivo.txt") and print "Archivo abierto con éxito";

while (print "soy un bucle infinito") { }
// Equivale a while (1) (bucle infinito) y estaríamos mostrando siempre la cadena indicada.

?>

Nótese que en ninguno de casos anteriores podríamos sustituir print por echo:
$array=file("archivo.txt") or echo "No se pudo abrir"; 

daría un parse error debido a que echo no devuelve valor alguno.

Nótese también que al no ser print una función, podemos prescindir de los paréntesis. Más bien diremos que la razón no es que no sea una función sino que sea una construcción del lenguaje, porque por ejemplo unset() tampoco es un función (es una declaración) pero sí requiere paréntesis.

No hay tampoco diferencias de velocidad entre ambas construcciones, si acaso print es infinitesimalmente más lenta por devolver el valor "true", pero nada significativo ni que deba preocuparnos. En usos generales, la elección depende de los gustos del programador.

Otra de las sutiles diferencias entre estas dos construcciones es que echo acepta múltiples argumentos, mientras que print no:
<?
echo "hola ","adios ","a todos";
// Mostrará -> hola adios a todos
?>


Como veras pocas consecuencias se desprenden de este hecho.

4. Comillas simples y comillas dobles
Entramos en el apasionante mundo de las comillas, que nos perseguirá durante la concatenación de cadenas y por supuesto, durante el viaje a través de las comillas automágicas (magic_quotes) que nos pueden dar más de un quebradero de cabeza.

Dos aspectos básicos a modo de resumen:

Las comillas simples muestran el contenido tal y como lo hemos escrito.

Las comillas dobles parsean nuestra cadena en busca de posibles variables a interpretar por PHP.

Consecuencias inmediatas:

Las comillas simples son más rápidas que las dobles porque no pierden el tiempo interpretando el contenido.

Algunos ejemplos:

<?
echo 'Esto es una cadena normal y corriente, tardo poco porque no me parseo';
echo "Aquí PHP mira a ver si tengo algo dentro que pueda interpretar, tardo un poco más";
?>

<?
$var="php-hispano.net";
echo 'Me encanta $var'; // muestra: Me encanta $var
echo "Me encanta $var"; // muestra: Me encanta php-hispano.net
?>

Ventajas y desventajas del uso de ambos tipos de comillas:
<?
$var="http://www.php-hispano.net";

//No necesito escapar las dobles comillas aquí
echo '<input type="text" name="campo">';

//Sin embargo me veo obligado a concatenar $var, para que se sustituya por su valor
echo '<a class="link" href="'.$var.'">php para torpes</a>';

//Con comillas dobles, $var se sustituirá por su contenido sin concatenar, pero necesito escapar las dobles comillas
echo "<a class=\"link\" href=\"$var\">php para torpes</a>";

//Aunque esto parece que sigue siendo más rápido
echo "<a class=\"link\" href=\"".$var."\">php para torpes</a>";

?>

Atención a lo siguiente:
<?
echo 'Hola mundo\n' // muestra : Hola mundo\n (No hace el salto de línea!!)
?>

Esto no puede parecer determinante cuando hacemos un echo, pero cuando estamos tratando una cadena para su uso posterior nos puede dar algún problema. Es por eso que los strings suelen ir entre dobles comillas:
<?
$string="Hola mundo\n"; //Contiene el salto de línea esperado.
$var="phpcentral.com";
$string="Ingresan a $var\n"; // Produce "Ingresan a phpcentral.com" y hace un salto de linea
?>

Dentro de las dobles comillas es posible que necesites escapar caracteres, como el carácter de $, las dobles comillas o el backslash. Las comillas simples no necesitan ser escapadas, al igual que las dobles no lo necesitaban dentro de las simples.

<?
$var="phpcentral.com";
$nombre="valor";
echo "$var tiene una variable llamada \$nombre";
// mostrará phpcentral.com tiene una variable llamada $nombre
// Nótese que equivale a: echo $var.' tiene una variable llamada $nombre';

echo "$var tiene una variable llamada $nombre"; // producirá obviamente: phpcentral.com tiene una variable llamada valor

// Un caso especial:
echo "$var tiene una variable llamada '$nombre'";  // 


Producirá:phpcentral.com tienen una variable llamada 'valor'

// A pesar de que $nombre esté entre comillas simples, se parsea y se sustituye por su valor
// ya que la cadena entera está a su vez metida en comillas dobles
// Esto tiene una aplicacion directa en los querys mySQL
// Las dos siguientes expresiones son equivalentes, usamos \ para escapar la propia barra invertida.
echo "Hola mundo\\n";
echo 'Hola mundo\n';
?>


Dos sutilezas, si necesitas poner una cantidad en dólares o pesos $ dentro de unas dobles comillas:
echo "Tengo $1000";

No hace falta escapar nada, mostrará "Tengo $1000" debido a que un nombre de variable en PHP no puede comenzar por un número.

Si sólo necesitas poner un símbolo $ podrás hacerlo tal cual.
echo "Este es el símbolo $"; 


que mostrará: "Este es el símbolo $"

Sin embargo:
<?
$nombre="valor";
$valor="12345";
echo "La variable $$nombre vale $valor";   // Produce: "La variable $valor vale 12345";
?>


5. Llaves y concatenación
¿Concatenar o no concatenar? A estas alturas, ya sabemos que el operador de concatenación de cadenas es el punto "." Sin embargo también sabemos que las variables se parsean dentro de dobles comillas. Aunque éste método sea ligeramente más lento que concatenar (tarda más en parsear) en ocasiones no concatenar aumenta la claridad del código.

<?
// Equivalentes
$string="Insert into tabla values ('".$nombre."','".$direccion."','".$telefono."')";
$string="Insert into tabla values ('$nombre','$direccion','$telefono')";
?>


Si queremos parsear una función dentro de un string entonces sí que tendremos que concatenar:

<?
$array=array("jueves","viernes");
echo "La hora actual es: ".date("H:i")." y ayer fue ".implode (" o ",$array).", la memoria me falla.";
// Esto produciría: La hora actual es 12:00 y ayer fue jueves o viernes, la memoria me falla.
?>


Las llaves evitan que tengamos que concatenar arrays con claves no numéricas, a la vez que nos permiten delimitar el tamaño del nombre de la variable a mostrar:

<?
$string="Insert into tabla values ('".$_POST['nombre']."','".$_POST['direccion']."','".$_POST['telefono']."')";
$string="Insert into tabla values ('{$_POST['nombre']}','{$_POST['direccion']}','{$_POST['telefono']}')";
?>


Este ejemplo de php.net es tan gráfico que lo pondré tal cual.
<?
$beer = 'Heineken';
echo "$beer's taste is great";    // Funciona, "'" is un carácter inválido para nombres de variable
                                  // Mostrará: Heineken's taste is great
echo "El bebió algunas $beers";   // No funciona, "s" es un carácter válido para variables, y $beers no tiene valor
                                  // mostrará: El bebió algunas
echo "El bebió algunas ${beer}s"; // Funciona: El bebió algunas Heinekens
echo "El bebió algunas {$beer}s"; // Funciona: El bebió algunas Heinekens
?>

Si queremos mostrar un array multidimensional sin concatenar, siempre usaremos llaves. echo "El valor es {$array['mamiferos']['especie']}";

Para especificar una clave no numérica de un array qué usamos, ¿comillas? ¿comillas dobles? ¿nada?

Todas las normas dichas en el apartado de comillas simples y dobles valen para explicar lo que viene a continuación. Las comillas simples no parsean el contenido y las dobles sí.

Si la clave es numérica ...$array[0],$array[1]... podemos y debemos prescindir de cualquier tipo de comilla.

Sin embargo, $array[clave] nunca debería ser usado, a no ser que 'clave' sea una constante que hayamos previamente definido,

$array['mamiferos']='perro';
define ('CLAVE','mamíferos'); echo $array[CLAVE]; Daría: perro y no saltaría un notice.


Si no existe esa variable definida, PHP arroja un error de constante no definida (Sí, sí, lo arroja siempre, otra cosa es que no lo veamos porque tengamos el reporte de notices desactivado). Podes hacer la prueba con un error_reporting (E_ALL); al principio del script.
La única razón por la que $_POST[variable] (sin comillas) parece funcionar es que PHP convierte automáticamente algo "que no está asignado" a un string que el parser puede digerir. Pero es una costumbre a evitar.

Lo dice php.net
<?
error_reporting (E_ALL);
$array['mamiferos']='perro';
echo $array[mamiferos]; // Daría -> Notice: Use of undefined constant mamiferos - assumed 'mamiferos'
// Asume automáticamente que queríamos decir 'mamiferos' en vez de mamiferos y muestra: perro
?>


Algunos ejemplos:
<?
$menu=array ('pollo','lentejas','cerdo','pasta','fruta','trucha','garbanzos');

echo "Hoy comemos: {$menu[rand(0,6)]}"; // o echo "Hoy comemos: ".$menu[rand(0,6)];

// rand(0,6) devuelve un índice numérico aleatorio que se corresponderá con el elemento del array
// al ser numérico no lleva ningún tipo de comillas

$menu=array ('lunes'=>'pollo','martes'=>'lentejas','miercoles'=>'cerdo','jueves'=>'pasta','viernes'=>'fruta',
             'sabado'=>'trucha','domingo'=>'garbanzos');  

echo "Hoy comemos: {$menu['lunes']}"; // o echo "Hoy comemos: ".$menu['lunes'];

// mostrará "Hoy comemos: pollo"

// Aquí usamos comillas simples para definir un string que no necesita ser parseado

$dia='miercoles';
echo "Hoy comemos: {$menu[$dia]}"; // o echo "Hoy comemos: {$menu["$dia"]}";

// mostrará "Hoy comemos: cerdo"

// Entre las dobles comillas $dia se parseará de todas formas y nos devolverá 'miercoles'

echo "Hoy comemos: {$menu['$dia']}"; // No funciona como esperamos

// No se interpreta como esperamos, y buscara en el array una clave que sea literalmente "$dia" (que no existe)
?>


Como extra les dejo un libro en PDF Bajo Licencia Creative Commons.
Muy recomendado para principiantes ya que inicia con PHP desde cero, MYSQL (bases de datos) pasando por Programación Orientados a Objetos y continua con MVC, etc. El libro consta de 376 páginas de puro conocimiento de gran valor.
Descarga del PDF: El lenguaje PHP - Eugenia Bahit.pdf


Espero que este aporte sea de utilidad.

Están invitados en aportar más sobre este tema en los comentarios.

Que tengan un buen día.

Saludos
Tags: Input - PHP - Tutorials Votes: 5 - Answers: 4 - Views: 12 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 02-05-2018 12:56:31 Excelente aporte, Walter. Gracias.   Votes: 1 - Link answer
     
  • Date: 02-05-2018 15:47:58 Jerson gracias por comentar
    Espero que te sea útil
    Saludos
      Votes: 0 - Link answer
     
  • Date: 03-05-2018 05:59:06 Muy bueno pero usas demasiado la sintáxis corta para inicira bloques de PHP <? ... ?> y esta no es parte de PSR además de que la misma página de PHP desaconseja su uso por depender de que la configuración de la misma esté activa a través de enable-short-tags.

    La sintáxis correcta y recomendada es <?php ... ?>.

    Un error notorio en tu explicación es respecto a la sintáxis <?= ?>. Esta sintáxis No depende de la configuración enable-short-tags desde la versión 5.4.0. La misma documentación te lo aclara.

    La sintáxis <?=$foo?> es la versión corta de echo $foo. Generalmente se utiliza en las vistas o para desplegar el valor de una variable PHP en un bloque HTML.

    Una omisión interesante es que dado que echo no es una función se le puede llamar sin utilizar paréntesis.

    Hablando de micro optimizaciones puedes destacar el hecho de que no es necesario concatenar cuando se llama a echo:

    <?php
    $separador = '-';
    //Concatenando
    echo 'uno' . $separador . 'dos' . $separador . 'tres' . $separador . 'cuatro' . PHP_EOL;
    //vs
    echo 'uno' , $separador , 'dos' , $separador , 'tres' , $separador , 'cuatro', PHP_EOL;
    


    El caso que utiliza las comas no ejecutará la lógica de concatenación pero arrojará el mismo resultado.

    Otra cosa interesante de notar es muchas sentencias echo consecutivas pueden remplazarse utilizando la sintaxis HEREDOC y/o NOWDOC
      Votes: 2 - Link answer
     
  • Date: 10-05-2018 18:30:55 Ernesto es muy bienvenida tu aclaración correctiva. (+1)
    Estoy totalmente de acuerdo contigo en que debe ser evitado el uso de short-tags las misma doc de PHP lo sugiere.
    Tal vez la forma en plantear el tema no es la más aconsejable por todo lo que indicas, humildemente mi intención era hacerlo de la manera más simple para quienes recién comienzan y luego avanzar mas sobre el tema.

    Lo que expones ayuda mucho y lo agradezco sinceramente.

    Sobre HEREDOC y/o NOWDOC si es muy interesante por su simplicidad y sus ventajas que ofrece.

    Se podría agregar en un comentario en este post la explicación de su uso.

    Saludos
      Votes: 2 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com