Utilisation d'une fonction finale héritée

Petit nouveau ! | 5 Messages

17 août 2010, 17:07

Bonjour,

Alors que je lisais un cours sur les exceptions, je me suis arreté sur un code que je ne comprenais pas:
<?php
    class MonException extends Exception
    {
        public function __construct ($message, $code = 0)
        {
            parent::__construct ($message, $code);
        }
        
        public function __toString()
        {
            return $this->message;
        }
    }
    
    function additionner ($a, $b)
    {
        if (!is_numeric ($a) OR !is_numeric ($b))
            throw new MonException ('Les deux paramètres doivent être des nombres'); // On lance une exception "MonException"
        
        if (func_num_args() > 2)
            throw new Exception ('Pas plus de deux arguments ne doivent être passés à la fonction'); // Cette fois-ci, on lance une exception "Exception"
        
        return $a + $b;
    }
    
    try // On va essayer d'effectuer les instructions situées dans ce bloc
    {
        echo additionner (12, azerty), '<br />';
        echo additionner (15, 54, 45), '<br />';
    }
    
    catch (MonException $e) // On va attraper les exceptions "MonException" s'il y en a une qui est levée
    {
        echo '[MonException] : ', $e; // On affiche le message d'erreur grâce à la méthode __toString que l'on a écrite
    }
    
    catch (Exception $e) // Si l'exception n'est toujours pas attrapée, alors on va essayer d'attraper l'exception "Exception"
    {
        echo '[Exception] : ', $e->getMessage(); // La méthode __toString() nous affiche trop d'informations, on veut juste le message d'erreur
    }
    
    echo '<br />Fin du script'; // Ce message s'affiche, ça prouve bien que le script est exécuté jusqu'au bout
?>
A la l'instruction du premier bloc catch
echo '[MonException] : ', $e; // On affiche le message d'erreur grâce à la méthode __toString que l'on a écrite
Je ne comprend pas pourquoi on ne peut écrire
echo '[MonException] : ', $e->getMessage();
Puisque la classe MonException hérite de Exception, elle devrait contenir la méthode getMessage non ?

Merci de bien vouloir m'éclairer,
Cordialement.

ViPHP
ViPHP | 5462 Messages

17 août 2010, 17:15

tu peux ecrire getMessage mais MonExecption a une méthode __toString qui te permet de faire direct echo $e (faire echo $e appelle __toString)

Petit nouveau ! | 5 Messages

17 août 2010, 18:36

D'accord, donc ici le fait d'avoir réecrit la méthode __toString servait juste d'exemple pour le cours, ça n'a pas de réel interet de la surcharger si on peut obtenir le même résultat avec getMessage qui est déjà définie dans la classe Exception ?

ViPHP
ViPHP | 5462 Messages

17 août 2010, 19:11

D'accord, donc ici le fait d'avoir réecrit la méthode __toString servait juste d'exemple pour le cours, ça n'a pas de réel interet de la surcharger si on peut obtenir le même résultat avec getMessage qui est déjà définie dans la classe Exception ?
exactement :wink:

Petit nouveau ! | 5 Messages

17 août 2010, 19:39

Merci :)