duduromeroa.com

Programación web

Sintaxis y códigos útiles del lenguaje PHP: try{} catch{}, declare(), die(), goto, require/include


www.duduromeroa.com, animación, lector, gif

Por Eduardo Romero

Guayaquil, Ecuador

Contacto duduromeroa@gmail.com

#Guayaquil, #PHP, #orientacionObjetos, #programación, #duduromeroa


ATENCIÓN: Los conceptos a continuación requieren de conocimiento previo en fundamentos de programación. Reseñas de otros lenguajes de programación se hallan en este vínculo.



Gestión de errores mediante bloques de control try{} catch{}

Útil para establecer y mostrar alertas en la ejecución de bloques de código. La palabra exception es usada para indicar que todo será ejecutado excepto tal sintaxis (a causa de algo inesperado). Sin embargo, este bloque de código no soluciona el error, simplemente da alertas que hemos definido en su sintaxis:

En .PHP

<?php 

// Abre bloque
try {
    // Damos valores para una división
    $numerador = 10;
    // Esto causará un error
    $denominador = 0; 

    // Si $denominador  es true, entra
    // Nosotros decidimos qué condición daría error. 
    if ($denominador == 0) {
    // Lanza alerta
    throw new Exception("Error: Imposible dividir para cero.");
    }

    /*  Si $denominador hubiera sido false (o sea > 1) 
    hubiera entrado aqui */
    $resultado = $numerador / $denominador;
    echo "El resultado es: $resultado";

        } catch (Exception $errorFeo) {
        // Capturamos y manejamos la excepción
        echo "Se produjo una excepción: " . $errorFeo -> getMessage();
}

/* Muestra: "Se produjo una excepción: 
Error: Imposible dividir para cero".  */

?>

Sentencia declare()

Reacciona ante instrucciones ejecutadas desde PHP mediante eventos. No son alertas ni mensajes de errores. Simplemente allí definimos qué debe hacer la sentencia declare mientras tantas líneas de código PHP son ejecutadas.

En el ejemplo de abajo se pide que 'declare()' ejecute algo mientras cada instrucción sea ejecutada (en este caso, por cada una instrucción, definido eso en declare(ticks=1);). Una instrucción ejecutada puede ser desde un echo, un bucle o cualquier otra expresión ejecutable. La palabra tick pueden entenderse como un evento activado según tantas ejecuciones de código.

En .PHP

<?php 

// Por qué es 1? Pueden ser más números:
    // ticks=1 .. ejecuta la función de tick después de UNA instrucción ejecutada.
    // ticks=2 .. ejecuta la función de tick después de DOS instrucciones ejecutadas
    declare(ticks=1);  

// Un código ejecutable común
// Es al "tick" que activa la función cositotickHandler()
function cositotickHandler() {
    echo "A - función activada" . "
"; } // Registra solo la función que será invocada en cada tick // La función a invocar es 'cositotickHandler()' // Pero también, ESTO SE EJECUTARÁ CADA VEZ QUE UNA INSTRUCCIÓN SEA EJECUTADA register _tick_function ('cositotickHandler'); // Otro código ejecutable común // Es el primer echo que dispara un "tick". echo "B - Instruccion activada" . "
"; ?>

Lo anterior resulta por lo siguiente:

  • declare(ticks=1); Indica que después de cada instrucción ejecutada (sea un echo u otra sentencia) se ejecutará la función registrada con register_tick_function()
  • function cositotickHandler() Se ejecuta cuando un "tick" es activado.
  • register _tick_function ('cositotickHandler') Registra la función cositotickHandler() para que se ejecute cada vez que se dispare un "tick".
  • echo "holi-B"... Esta instrucción dispara un "tick" .

Después de que PHP ejecuta el echo "B - Instruccion activada", se activa un "tick" y se llama a la función cositotickHandler(). Sin embargo, en el ciclo de ejecución, PHP también trata de ejecutar la función de tick durante el procesamiento de las instrucciones restantes, lo que genera dos invocaciones más de la función cositotickHandler(). Esto ocurre debido a la estructura interna de cómo PHP maneja las funciones de tick durante el ciclo de ejecución del código.

Función die()

Esta función finaliza la ejecución de código y luego, muestra un mensaje. La función die() (un símil de otra función idéntica, exit()) no contiene argumentos.

Además, die() no solo muestra un mensaje, sino que también detiene la ejecución del código luego de mostrar el mensaje. Algo que no hace un simple echo "...";.

En .PHP

<?php

    /* Una función común, 
    con una variable como argumento */
    function verificarEdad($edad) {

        // Condicional opera con el argumento de la función
        // Si esta condición es true, entra...
        if ($edad < 18) {
            die("Denegado. Debes tener al menos 18 años."); 
            // Detiene y da mensaje
        }
        // Si la edad es > 18
        echo "Tienes " . $edad . ", tu edad es aceptable.";
    }

    // Simulando la edad de un usuario
    $edadUsuario = 14;

    verificarEdad($edadUsuario);  
    // Llamamos a la función para verificar la edad

    // Muestra:
    // Denegado. Debes tener al menos 18 años.

?>

die() es útil para indicar que si una conexión desde PHP hacia una base de datos no es posible, entonces toda ejecución de código será detenina.

Operador goto

Permite saltar desde su invocación hacia otra etiqueta (etiqueta de destino) que finaliza con dos puntos y que permita ejecutar un código dado. Tiene limitantes:

  • La etiqueta de destino debe estar dentro del mismo archivo y dentro de la misma función. NO puede saltar de una función o método a otra función.
  • Tampoco se puede saltar a ningún tipo de bucle o estructura de conmutación.

En .PHP

<?php
    // Inicia una ejecución cualquiera
    echo "Inicio del script
"; // Se define etiqueta de destino goto destino; echo "Este código nunca se ejecutará
"; // Aqui la etiqueta de destino destino: echo "Hemos saltado a la etiqueta 'destino'.
"; ?>

En resumen, NO SE RECOMIENDA excederse en el uso de goto, pues demasiados saltos puede hacer el código confuso para quién no aplicó ese operador. Ojo con el operador elseif abajo en el código PHP. Es diferente al de Javascript else if (separado).

En .PHP

<?php

$valor = 3;

    if ($valor == 1) {
            goto etiqueta1;

        } elseif ($valor == 2) {
            goto etiqueta2;

        // Según $valor, este else se activará:
        } else {
            goto etiqueta3;
    }

    etiqueta1:
    echo "Valor es 1.
"; goto fin; etiqueta2: echo "Valor es 2.
"; goto fin; // Esta etiqueta será activada etiqueta3: echo "Valor es 3.
"; fin: echo "Fin.
"; // Muestra // Valor es 3. Fin. ?>

Inserción de sintaxis HTML mediante require e include

Ambos son constructores. En lenguajes de programación un constructor es una sintaxis cuyo objetivo es crear un grupo más completo de datos llamado objeto. En el mismo ámbito, un objeto es un conjunto de datos en forma de propiedades y eventos, propios de ese único objeto (Constructors, 2003).

Puede hallar una extensa reseña de los objetos en lenguajes de programación, como Javascript, en esta sección; y también de los métodos constructor (también en Javascript) en esta sección.



Ambos constructores permiten dividir lo que sería un extenso código en partes más reducidas, cargando los archivos solo cuando sea necesario; o colocando las funciones reutilizables en un archivo aparte, y llamarlas mediante los constructores cuando sea necesario invocar esas funciones. Los archivos a incrustar pueden estar en la carpeta raíz o en una anidada para apuntar desde los constructores a esos archivos mediante una ruta correcta.

Uso de require

Con require intentar insertar un archivo que no existe detendrá todo el código y dará un mensaje de error fatal. Por lo que ese constructor será útil cuando estemos totalmente seguros de que el archivo a insertar sí existe. require es útil para insertar librerías PHP, muy necesarias.

En los ejemplos inferiores, las cajas de texto 'Estoy aqui gracias a...' son arhivos HTML ubicados en la misma carpeta que esta página web, pero esos archivos estan siendo insertados en esta página mediante los códigos correspondientes (ojo cómo agregué los estilos CSS en la línea final de echo "...):

En .PHP

<?php 
    require 'ejemplo-require.html'; 
    // Error fatal si el archivo no existiese
    echo "<code style='font-size: 13px;'>" . 
    "Cargado correctamente." . "</code>";
?>
Estoy aqui gracias a require 'ejemplo-require.html';
Cargado correctamente.

Con require_once se insertará un archivo por una sola vez, cuidando así que nombres de variables u otras sintaxis se alteren. Con esa opción también se evita cargar por más de una vez un diseño web que está creado desde el código insertado.



Uso de include

Ahora con include: el código seguirá en ejecución aún si el archivo a insertar no está disponible. include es útil cuando se prevee que el archivo a incrustar podría no estar listo y por ende, no habrá interrupción del resto del código. include es muy usado para componentes visuales o de diseño web.

En .PHP

<?php 
    include 'ejemplo-include.html'; 
    // Si el archivo no existiese, el código NO se detendría.
    // Útil para diseño web
    echo "<code style='font-size: 13px;'>" . 
    "Cargado correctamente." . "</code>";
?>
Estoy aqui gracias a include
Cargado correctamente.

Con include_once se insertará un archivo por una sola vez (sin detener el código), cuidando no alterar variables u otras sintaxis. Finalmente, tener en cuenta esto: si los estilos apuntados e incrutados cuentan con reglas CSS que los recolocan en otro punto de la página, PHP respetará esas reglas CSS.

Insertar códigos no significa que estoy invocando sus funciones.

Insertar códigos o elementos HTML mediante los constructores include o require es una cosa. Invocar posibles funciones que estén en esos códigos es otra. Así como los insertos, las funciones deben estar invocadas explícitamente; es decir, declarando la invocación mediante sintaxis adecuada. Sin esa invocación de funciones estas nunca se ejecutarán aunque insertemos (mediante los constructores) los códigos que contengan esas funciones.

En .PHP, funciones

<?php 
// Archivo PHP con funciones
function header() { echo '<header><h1>Mi Encabezado</h1></header>'; }
function footer() { echo '<footer><p>Mi Pie de Página</p></footer>'; }
?>

En .PHP, archivo que pide inserción de las funciones de arriba

<?php 
/* Solo apunta e inserta 
el PHP que contiene las funciones 
header() y footer() */
require "design.php"; 

// Aquí es donde realmente se ejecuta la función
header(); 

// Ahora ejecuta la función footer()
footer(); 
?>

Un consejo final e importante en cuanto al uso de los constructores ya mencionados: cada insersión activará (allí en nuestro código receptor) la sintaxis del archivo insertado. Eso significa que si en el código PHP insertado existen variables globales, todo eso podría sobreescribir las variables o funciones de nuestro código receptor. Eso sería un desastre. Se recomienda tener en cuenta eso cuando insertemos en un archivo receptor la sintaxis PHP de otro archivo.