PHPlay

Curso de PHP gratis · Capítulo 1 de 13 · con Rasmus

Introducción a PHP: tu primer programa con echo

Empieza aquí si nunca has programado en PHP. Verás qué es un programa, qué hace PHP por dentro cuando lo ejecuta y cómo escribir tu primera línea con echo.

¿Qué es un programa?

Un programa es una lista de instrucciones que el ordenador sigue en orden, de arriba abajo, una detrás de otra.

PHP es un lenguaje interpretado: otro programa, el intérprete (el motor Zend), lee tu código y lo va ejecutando. Cuando pulsas Ejecutar pasan cuatro cosas:

  1. El lexer trocea el texto en piezas (tokens): echo, "¡Hola!", ;...
  2. El parser comprueba que las piezas encajan según la gramática de PHP y construye un árbol.
  3. El árbol se compila a instrucciones sencillas llamadas opcodes.
  4. La máquina virtual Zend ejecuta los opcodes uno a uno.
Pergamino del porque

Si escribes algo que no encaja con la gramática (un error de sintaxis), el paso 2 falla y no se ejecuta ni una sola línea. En cambio, si el error ocurre mientras el programa ya está en marcha (un error de ejecución), todo lo anterior sí se habrá ejecutado. Recordar esta diferencia te ahorrará muchos disgustos.

Mira el ejemplo de la derecha y pulsa Ejecutar.

<?php
echo "¡Hola, Valle Zend!";
Salida
¡Hola, Valle Zend!

La etiqueta <?php

Todo el código PHP va dentro de la etiqueta <?php. ¿Por qué hace falta? Porque PHP nació para mezclarse con HTML: el intérprete copia tal cual todo lo que está fuera de las etiquetas y solo ejecuta lo que está dentro.

En el ejemplo, las líneas con <h1> y <p> no son PHP: salen tal cual. Solo el echo se ejecuta.

La etiqueta de cierre ?> es opcional al final de un archivo. Si tu archivo solo contiene PHP, lo recomendable es no ponerla (así evitas que se cuelen espacios o saltos de línea sin querer).

Truco

<?= algo ?> es un atajo de <?php echo algo; ?>. Se usa mucho en plantillas HTML.

<h1>Mi granja</h1>
<?php echo "<p>Hoy es un gran día</p>\n"; ?>
<p>Cosechas: <?= 3 + 4 ?></p>
Salida
<h1>Mi granja</h1>
<p>Hoy es un gran día</p>
<p>Cosechas: 7</p>

echo y el punto y coma

echo escribe texto en la salida. El texto va entre comillas: eso es un string (una cadena de caracteres).

Cada instrucción termina con punto y coma ;, como el punto al final de una frase. El salto de línea del editor NO termina la instrucción: para PHP, lo que separa una instrucción de la siguiente es el ;.

Dentro de comillas dobles, \n significa "salto de línea". Sin él, todo sale seguido. También puedes pasarle varios trozos a echo separados por comas.

Cambia el ejemplo: quita un \n y mira qué pasa.

<?php
echo "Primera línea\n";
echo "Segunda línea\n";
echo "Tres ", "trozos ", "juntos\n";
echo "Sin salto...";
echo "...pegado";
Salida
Primera línea
Segunda línea
Tres trozos juntos
Sin salto......pegado
Pregunta

¿Qué pasa si olvidas el ; al final de una instrucción (y hay otra detrás)?

  1. PHP lo añade automáticamente
  2. Error de sintaxis: no se ejecuta NADA del programa
  3. Se ejecuta hasta esa línea y luego se para
Ver respuesta

B. Error de sintaxis: no se ejecuta NADA del programa

Exacto: el parser no puede entender el programa, así que falla antes de empezar. Ni siquiera las líneas anteriores al error se ejecutan.

Comentarios

Los comentarios son notas para las personas: PHP los ignora por completo (el lexer los descarta en el paso 1).

  • // esto es un comentario hasta el final de la línea.
  • # esto también (estilo antiguo).
  • /* esto puede ocupar varias líneas */

Úsalos para explicar el por qué de tu código, no el qué: echo "hola"; // escribe hola no aporta nada; // Saludo antes de cargar el dron para que el usuario sepa que va bien sí.

Truco

Un truco muy útil al depurar: "comentar" una línea para desactivarla sin borrarla.

<?php
// Esto no se ejecuta
echo "Uno\n"; // un comentario al final de la línea
# echo "Dos\n";
/*
echo "Tres\n";
echo "Cuatro\n";
*/
echo "Cinco\n";
Salida
Uno
Cinco

Llamar a funciones

Una función es una acción con nombre. Para usarla la llamas: escribes su nombre y, entre paréntesis, los datos que necesita (los argumentos).

strtoupper("hola")   // convierte a mayúsculas: "HOLA"
strlen("hola")       // cuenta caracteres: 4

Las funciones devuelven un valor que puedes usar, por ejemplo, con echo. PHP trae miles de funciones de serie. Los paréntesis son obligatorios aunque la función no necesite datos: cosechar().

Pergamino del porque

¿Por qué echo no lleva paréntesis? Porque no es una función: es una construcción del lenguaje (una palabra clave, como if o while). Por eso puedes escribir echo "a", "b"; y no podrías usarla donde se espera un valor.

<?php
echo strtoupper("despierta, bit-8"), "\n";
echo strlen("BIT-8"), "\n";
echo str_repeat("¡bip! ", 3), "\n";
Salida
DESPIERTA, BIT-8
5
¡bip! ¡bip! ¡bip! 

Las órdenes de BIT-8

BIT-8 tiene sus propias funciones. Las dos primeras:

  • mover(NORTE) mueve el dron una casilla. También SUR, ESTE y OESTE.
  • cosechar() recoge lo que haya debajo, si está maduro.

NORTE es una constante: un nombre fijo que no lleva $ ni comillas.

El campo usa coordenadas (x, y): la esquina de abajo a la izquierda es (0, 0); ESTE suma 1 a x y NORTE suma 1 a y.

Y un detalle importante: el campo es como un donut. Si BIT-8 sale por un borde, aparece por el contrario. En un campo de 3x3, ir al OESTE desde x = 0 te lleva a x = 2.

<?php
// BIT-8 en (0, 0) de un campo 3x3
cosechar();      // cosecha (0, 0)
mover(NORTE);    // ahora en (0, 1)
cosechar();
mover(ESTE);     // ahora en (1, 1)
mover(OESTE);    // vuelve a (0, 1)
mover(OESTE);    // ¡sale por la izquierda! (2, 1)
Pregunta

BIT-8 está en (0, 0) en un campo de 3x3. Ejecuta mover(NORTE); mover(NORTE); mover(ESTE);. ¿Dónde acaba?

  1. (1, 2)
  2. (2, 1)
  3. (0, 2)
  4. (1, 0)
Ver respuesta

A. (1, 2)

NORTE suma 1 a la y (dos veces: y = 2) y ESTE suma 1 a la x (x = 1). Resultado: (1, 2).

Los errores son tus amigos

Todos los programadores cometen errores. Todos. La diferencia está en leer bien el mensaje. Un error de PHP te dice tres cosas:

  1. El tipo: Parse error (sintaxis), Warning (aviso, el programa sigue), Fatal error (el programa se detiene).
  2. Qué ha pasado: Call to undefined function despertar().
  3. Dónde: on line 3.

En el ejemplo, la línea 2 se ejecuta y se imprime. En la línea 3 se llama a una función que no existe: error de ejecución, el programa se detiene y la línea 4 ya no llega a ejecutarse.

Debajo de cada error, el Oráculo te explicará en castellano qué significa. Los mensajes de PHP, en cambio, te los enseño en inglés, tal y como los verás en la vida real.

<?php
echo "Esto sí se ve\n";
despertar();
echo "Esto ya no\n";
Salida
Esto sí se ve
Pregunta

En el ejemplo, ¿por qué se ve "Esto sí se ve" si el programa tiene un error?

  1. Porque es un error de ejecución: lo anterior ya se había ejecutado
  2. Porque PHP ignora los errores
  3. Porque los errores solo afectan a la última línea
Ver respuesta

A. Porque es un error de ejecución: lo anterior ya se había ejecutado

Eso es. El programa era sintácticamente correcto, así que empezó a ejecutarse. Al llegar a la línea 3 falló y se detuvo.

Ejercicios de PHP resueltos

Intenta resolverlos antes de mirar la solución. En el juego puedes ejecutarlos y comprobarlos automáticamente.

Encargo 1. ¡Despierta, BIT-8!

BIT-8 necesita oír una frase exacta para despertar. Rasmus dice que los drones son muy quisquillosos con las mayúsculas y los signos.

Escribe un programa que imprima exactamente:

Hola, BIT-8
Pistas
  • Usa echo seguido del texto entre comillas y termina con ;.
  • Fíjate en la coma, el espacio y el guion: "Hola, BIT-8".
Ver solución
<?php
echo "Hola, BIT-8";

Misión del dron 2. Primera cosecha

BIT-8 ya flota, aunque todavía un poco atontado. En el campo hay hierba madura.

BIT-8 está en (0, 0). Cosecha las 3 hierbas de su columna (x = 0): la de debajo y las dos que hay hacia el NORTE.

Esta misión mueve al dron BIT-8 por un campo de cultivo: juégala en PHPlay para ver tu código animado.

Pistas
  • Alterna: cosechar(); y luego mover(NORTE);, y otra vez...
  • Necesitas 3 cosechar() y 2 mover(NORTE).
Ver solución
<?php
cosechar();
mover(NORTE);
cosechar();
mover(NORTE);
cosechar();

Caza de bugs 3. El programa roto

Rasmus escribió este programa hace años para que BIT-8 diera los buenos días, pero algo falla. "Mis trompas no son buenas para teclear", se excusa.

Arregla el programa para que imprima exactamente:

Buenos días, Valle Zend
BIT-8 está listo
Batería: 100%

Código de partida:

<?php
echo "Buenos días, Valle Zend\n"
ECHO "BIT-8 está listo\n";
echo 'Batería: 100%\n';
Pistas
  • Primero lee el Parse error: ¿en qué línea dice que hay algo inesperado? ¿Qué le falta a la línea anterior?
  • ECHO en mayúsculas no es un error: las palabras clave de PHP no distinguen mayúsculas. Busca el problema en otro sitio.
  • En comillas simples, \n no es un salto de línea: se imprime tal cual. Usa comillas dobles.
Ver solución
<?php
echo "Buenos días, Valle Zend\n";
ECHO "BIT-8 está listo\n";
echo "Batería: 100%\n";

Misión del dron 4. Ruta toroidal

Solo la hierba de la esquina noreste (2, 2) está madura. BIT-8 está en (0, 0) y tiene muy poca batería.

Cosecha la hierba de (2, 2) usando como mucho 2 movimientos. (Pista de Rasmus: "el campo es un donut".)

Esta misión mueve al dron BIT-8 por un campo de cultivo: juégala en PHPlay para ver tu código animado.

Pistas
  • Desde x = 0, ir al OESTE te lleva a x = 2.
  • Desde y = 0, ir al SUR te lleva a y = 2.
Ver solución
<?php
mover(OESTE);
mover(SUR);
cosechar();

Acertijo 5. La prueba de Rasmus

Rasmus se ajusta las gafas: "Antes de irte, demuéstrame que lo has entendido".

Responde a las cuatro preguntas.

  1. ¿Qué hace PHP con el texto que está FUERA de <?php ... ?>?

    1. Lo ignora
    2. Lo envía a la salida tal cual
    3. Da un error
    Ver respuesta

    B. Lo envía a la salida tal cual

  2. ¿Qué imprime este programa?

    <?php
    // echo "A";
    echo "B"; # echo "C";
    /* echo "D"; */
    1. ABCD
    2. B
    3. BC
    4. Nada
    Ver respuesta

    B. B

  3. Un programa tiene un error de sintaxis en la línea 10. ¿Qué se ejecuta?

    1. Las líneas 1 a 9
    2. Nada
    3. Todo menos la línea 10
    Ver respuesta

    B. Nada

  4. ¿Cuál de estas líneas es correcta?

    1. echo "Hola"
    2. Echo "Hola";
    3. echo(Hola);
    Ver respuesta

    B. Echo "Hola";

Chuleta: lo esencial

  • Todo el código PHP va dentro de <?php. Lo de fuera se envía tal cual.
  • Cada instrucción termina en ;. Las palabras clave no distinguen mayúsculas (echo = ECHO).
  • echo "texto"; escribe en la salida. \n es un salto de línea (en comillas dobles).
  • Comentarios: // línea, # línea, /* varias líneas */.
  • Llamar a una función: nombre(argumentos). Devuelve un valor.
  • Error de sintaxis → no se ejecuta nada. Error de ejecución → se ejecuta hasta el error.
  • BIT-8: mover(NORTE|SUR|ESTE|OESTE), cosechar(). (0,0) es la esquina suroeste y el campo "da la vuelta" por los bordes.