PEAR

(unknown)

PEAR -- Classe de base PEAR

Synopsis

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

Description

La classe de base PEAR fournit les fonctionnalités qui sont utilisées par la plus part des classes PEAR. Normalement, vous n'avez pas à utiliser cette classe directement : il vous suffit d'en hériter.

Les fonctionnalités marquantes sont :

Fonction de fin de requête

Si vous faîtes hériter de la classe PEAR, une classe appelée NomClasse, vous pouvez définir une méthode appelée _ClassName (le nom de la classe précédé d'un souligné), qui sera appelée lorsque le script prend fin. Ce n'est pas un destructeur, car vous pouvez détruire un objet avec cette méthode, mais le destructeur sera quand même appelé. C'est une fonction de callback, qui intervient lorsque le script prend fin. Voyez l'exemple.

Gestion des erreurs

La classe de base PEAR fournit aussi un moyen de manipuler des erreurs plus complexes qu'un simple booléen ou entier. Une erreur PEAR est un objet qui est une instance de la classe PEAR_Error, ou d'une de ses sous-classes.

Une des éxigences de conception des erreurs PEAR est qu'il ne faut pas forcer l'affichage d'erreurs, mais plutôt de fournir les outils pour les afficher, tout en laissant à l'utilisateur le choix de les utiliser. Cela permet de traiter correctement les erreurs, notamment si le format de sortie n'est pas HTML (par exemple WML ou XML).

L'objet d'erreur peut être configuré de nombreuses façons dès sa création : affichage d'erreur, affichage d'erreur suivi de la fin du script, envoie d'une erreur PHP avec trigger_error(), appeler une fonction de traitement, ou rien du tout. Vous pouvez typiquement spécifier ces parmètres dès le constructeur de PEAR_Error : tous ces paramètres sont optionnel, et PEAR fournit un moyen de gérer des valeurs par défaut. Voyez les exemples d'erreurs PEAR, pour avoir une illustration, et la documentation de PEAR_Error pour plus de détails.

Exemples

Les exemples ci-dessus montre comment utiliser les simili destructeurs, pour implémenter une classe qui gère le contenu d'un fichier, ajoute des données, et sauve le tout à la fin du script.

Exemple 1. Les simili destructeurs de PEAR

<?php
require_once "PEAR.php";

class FileContainer extends PEAR
{
    var $file = '';
    var $contents = '';
    var $modified = 0;
    
    function FileContainer($file)
    {
        $this->PEAR(); // cette ligne appelle le constructeur père
        $fp = fopen($file, "r");
        if (!is_resource($fp)) {
            return;
        }
        while (!empty($data = fread($fp, 2048))) {
            $this->contents .= $data;
    	}
        fclose($fp);
    }

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

    // le simili-destructeur est nommé d'après le nom de la classe
    // mais avec un souligné devant.
    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("Ceci se termine à la fin du fichier\n");

// Lorsque le script est terminé et que PHP s'arrête,
// le simili destructeur de $fileobj est appelé, et 
// met à jour les informations sur le disque
?>

Note : Les simili destructeurs de PEAR utilisent les fonctions de fin de script de PHP (register_shutdown_function()), et vous ne pourrez rien afficher dans ces fonctions, si vous utilisez un serveur web. En ligne de commande, toutefois, l'affichage se fera. C'est comme ca.

L'exemple suivant montre différentes façons d'utiliser le mécanisme d'erreur de PHP.

Exemple 2. Exemple d'erreurs PEAR(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"
}
?>

Cet exemple illustre une fonction de fsockopen() qui retourne le code d'erreur et, au cas échéant, le message retourné par le serveur. Notez que pear->iserror() sert à savoir si une valeur est une erreur PEAR.

Le mode opératoire de PEAR_Error dans cet exemple est de simplement retourner l'objet d'erreur, et laisser le reste au développeur. C'est le mode par défaut.

Dans le prochain exemple, on utilise d'autres modes :

Exemple 3. Exemple d'erreurs PEAR(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 "Toujours connecté<BR>\n";
?>

Ici, le mode par défaut est PEAR_ERROR_DIE, et comme on ne spécifie aucun mode d'erreur dans l'appel à (ce devrait être le troisième argument), raiseError utilise le mode par défaut, et termine le script si fsockopen() échoue.