Introducción

Introducción – Cómo emplear la clase base PEAR (destructoress, manejo de errores)

Synopsis

require_once "PEAR.php";
class classname extends PEAR { ... }

Descripción

La clase base PEAR proporciona la funcionalidad estándar para l amayoría de clases de PEAR. Normalmente nunca crearás una instancia de la clase PEAR directamente, emplealá creando una subclase que la extienda.

Sus características básicas son:

  • "destructores" de objetos request-shutdown
  • manejo de errores

"destructores" PEAR

Si heredas PEAR en una clase llamada ClassName, puedes definir un método llamado _ClassName (el nombre de la clase con un guión bajo delante) que será invocado cuando la petición finalice. No es un destructor en el sentido de que puedas "borrar" un objeto y llamar al destructor, sino en el sentido en que PHP te permite emplear un callback en el objeto cuando PHP ha terminado la ejecución. Ver el ejemplo siguiente.

¡Importante!

Para que los destructores funcionen correctamente, debes instanciar tu clase con el operador "=& new" como sigue:

<?php
$obj 
=& new MyClass();
?>

Si sólo usas "= new", el objeto registrado en la lista de finalización de PEAR será una copia del objeto en el momento en que se llama al constructor, y va a ser este "destructor" copiado el que sea llamado cuando se concluya la ejecución.

Gestión de Error de PEAR

La clase base de PEAR también proprociona un modo de pasar errores más complejos que un valor true/false value o un código numérico. Un error PEAR es un objeto que es, bien una instancia de la clase PEAR_Error, bien de alguna clase que herede PEAR_Error.

Uno de los criterios de diseño de los errores de PEAR es que no deberían forzar un tipo particular de salida al usuario, debería ser posible manejar errores sin ningún tipo de salida si fuese lo deseable. Esto hace posible gestionar errores elegantemente, incluso cuando el formato de salida es distinto de HTML (por ejemplo WML u otro formato XML).

El objeto de error puede configurarse para hacer un número de cosas cuando se crea, como imprimir un mensaje de error, imprimir el mensaje y salir, lanzar el error con la función de PHP trigger_error(), invocar un callback, o ninguna de las anteriores. Esto suele especificarse en el constructor de PEAR_Error, pero todos los parámetros son opcionales, y se pueden fijar por defecto para los errores generados por cada objeto basado en la clase PEAR. Ver los ejemplos de PEAR para comprobar cómo usarlo y la referencia de PEAR_Error para tener más detalles.

Ejemplos

El siguiente ejemplo muestra cómo usar los "destructores emulados para pobres" de PEAR implementando una clase simple que guarda los contenidos de un archivo, te permite añadir datos al objeto y envía los datos al archivo antes de que acabe la petición:

PEAR: destructores emulados

<?php
require_once "PEAR.php";

class 
FileContainer extends PEAR
{
    var 
$file '';
    var 
$contents '';
    var 
$modified 0;

    function 
FileContainer($file)
    {
        
$this->PEAR(); // llamada al constructor de la clase padre
        
$fp fopen($file"r");
        if (!
is_resource($fp)) {
            return;
        }
    
$this->file $file;
        while (
$data fread($fp2048)) {
            
$this->contents .= $data;
        }
        
fclose($fp);
    }

    function 
append($str)
    {
        
$this->contents .= $str;
        
$this->modified++;
    }

    
// El "destructor" se llama como el constructor
    // pero con un guión bajo delante.
    
function _FileContainer()
    {
        if (
$this->modified) {
            
$fp fopen($this->file"w");
            if (!
is_resource($fp)) {
                return;
            }
            
fwrite($fp$this->contents);
            
fclose($fp);
        }
    }
}

$fileobj =& new FileContainer("testfile");
$fileobj->append("this ends up at the end of the file\n");

// Cuando concluye la petición y PHP finaliza, se llama al
// "destructor" de $fileobj y actualiza el archivo en disco.
?>
Los "destructores" de PEAR usan shutdown callbacks de PHP (register_shutdown_function()), y en PHP < 4.1, no puedes devolver ninguna salida cuando PHP corre en un servidor web. Por tanto, cualquier cosa que se imprime en un "destructor" se pierde, excepto cuando PHP se us aen modo línea de comandos. En PHP 4.1 y superior, la salida puede generarse también en el destructor. Ver, también la advertencia sobre cómo instanciar objetos si quieres emplear el destructor.

Los siguientes ejemplos ilustran diferentes modos de usar el mecanismo de gestión de errores de PEAR.

PEAR error ejemplo (1)

<?php
function mysockopen($host "localhost"$port 8090)
{
    
$fp fsockopen($host$port$errno$errstr);
    if (!
is_resource($fp)) {
        return new 
PEAR_Error($errstr$errno);
    }
    return 
$fp;
}

$sock mysockopen();
if (
PEAR::isError($sock)) {
    print 
"mysockopen error: ".$sock->getMessage()."<BR>\n"
}
?>

Este ejemplo muestra un wapper para fsockopen() que comunica el códio y el mensaje de error (si hay) devuelto por fsockopen en un objeto PEAR error. Notar que PEAR::isError() se emplea para detectar cuando un valor es un error de PEAR.

El modo de operación de PEAR_Error en este ejemplo es simplemente devolver el objeto de error y dejar el resto al usuario (programador). Este es el modo de error por defecto.

En el siguiente ejemplo mostraremos cómo usar los distintos modos de error por defecto:

PEAR error ejemplo (2)

<?php
class TCP_Socket extends PEAR
{
    var 
$sock;

    function 
TCP_Socket()
    {
        
$this->PEAR();
    }

    function 
connect($host$port)
    {
        
$sock fsockopen($host$port$errno$errstr);
        if (!
is_resource($sock)) {
            return 
$this->raiseError($errstr$errno);
        }
    }
}

$sock = new TCP_Socket;
$sock->setErrorHandling(PEAR_ERROR_DIE);
$sock->connect("localhost"8090);
print 
"still alive<BR>\n";
?>

Aquí, hemos fijado el modo de error por defecto a PEAR_ERROR_DIE, y dado que no especificamos ningún modo de error en la llamada a raiseError (sería el tercer parámetro), raiseError usa el modo de error por defecto y sale si fsockopen falla.

Variables Globales Empleadas

La clase base PEAR us algunas variables globales para registrar globales por defecto, y un objeto lista empleado por los "destructores". Todas las variables globales asociadas con la clase PEAR tienen el prefijo _PEAR_.

$_PEAR_default_error_mode
Si no se fija ningún modo de error por defecto en un objeto, este modo será empleado. Debe ser uno de PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE or PEAR_ERROR_CALLBACK.

No fijar directamente esta variable, llamar PEAR::setErrorHandling() como método estático como sigue:

<?php
PEAR
::setErrorHandling(PEAR_ERROR_DIE);
?>
$_PEAR_default_error_options
Si el modo de error es PEAR_ERROR_TRIGGER, este es el nivel de error (uno de E_USER_NOTICE, E_USER_WARNING o E_USER_ERROR).

No fijar directamente esta variable, llamar PEAR::setErrorHandling() como método estático como sigue:

<?php
PEAR
::setErrorHandling(PEAR_ERROR_TRIGGERE_USER_ERROR);
?>
$_PEAR_default_error_callback
Si ningún parámetro options se usa cuando se lanza un error y el modo de error es PEAR_ERROR_CALLBACK, el valor de esta variable se usa como callback. Esto significa que puedes elegir el modo de error temporalmente y volver al modo del callback sin volver a especificar la función del callback. Un valor de cadena representa una función, un array de dos elementos con un objeto en el índice 0 y una cadena en el índice 1 representa un método.

De nuevo, no fijar directamente esta variable, llamar PEAR::setErrorHandling() como método estático como sigue:

<?php
PEAR
::setErrorHandling(PEAR_ERROR_CALLBACK"my_error_handler");
?>

Aquí hay un ejemplo de como puedes ir hacia adelante y hacia atrás sin volver a especificar la función de callback:

<?php
PEAR
::setErrorHandling(PEAR_ERROR_CALLBACK"my_function_handler");
do_some_stuff();
PEAR::setErrorHandling(PEAR_ERROR_DIE);
do_some_critical_stuff();
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK);
// de nuevo estamos usando my_function_handler
?>
PEAR (Previous) Constantes Predefinidas (Next)
Last updated: Sat, 22 Nov 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.