II. Héritage de la classe d'Exception▲
La classe d'exception que nous avons utilisée jusqu'ici est la classe native de PHP5. Nous allons maintenant définir nos propres classes d'exception adaptées à nos besoins, héritant de cette classe mère. Nous allons commencer par étudier les propriétés de la classe native puis comment créer et/ou utiliser les classes filles.
II-A. Méthode et attributs de la classe Exception▲
II-A-1. Attributs▲
La classe Exception possède 4 attributs protected (ce qui nous permet d'y avoir accès depuis une classe fille).
II-A-2. Méthodes▲
La classe possède un seul constructeur :
function __construct(string $message
=
NULL,
int code=
0);
Ce constructeur est le seul moyen d'affecter des valeurs aux attributs $message et $code. Ces deux attributs doivent donc naturellement être définis par l'utilisateur. Pour instancier la classe et ainsi définir les valeurs de $message et $code, on utilise l'instruction throw vue ci-dessus.
La classe définit ensuite plusieurs accesseurs à ces attributs.
final function getMessage();
//
message
de
l'exception
final function getCode();
//
code
de
l'exception
final function getFile();
//
nom
du
fichier
source
final function getLine();
//
ligne
du
fichier
source
final function getTrace();
//
un
tableau
de
backtrace()
final function getTraceAsString();
//
chaîne
formattée
de
trace
Les 4 premières méthodes renvoient les attributs respectifs. La méthode getTrace renvoie un tableau de toutes les exceptions lancées. En effet, comme vous choisissez vous même le comportement d'un traitement d'exception, vous n'êtes pas obligé d'interrompre le script comme le ferait une erreur PHP.
- line - La ligne où s'est déroulée l'erreur
- file - Le fichier où s'est déroulée l'erreur
- function - La fonction concernée
- class - La classe concernée
- type - Type d'appel de la méthode (statique ou dynamique)
- args - Les arguments de la méthode
Enfin, la denière méthode renvoie, comme la précédente, l'ensemble des exceptions lancées, mais sous forme de string.
Il faut noter que ces fonctions sont finales, elles ne peuvent donc pas être surchargées dans une classe fille.
II-B. Exemple d'héritage▲
La classe Exception de PHP5 est utilisable dans sa forme native, mais le but des exceptions est d'effectuer un traitement adapté en réponse à une alerte particulière. PHP5 permet donc d'étendre cette classe par héritage.
Voyons un exemple :
<?php
class
MyException extends
Exception
{
public
function
__construct
($msg
=
NULL
,
$code
=
0
)
{
parent
:
:
__construct
($msg
,
$code
);
}
public
function
addLog()
{
//
Ajoute
un
log
dans
la
table
mysql_query("
INSERT
INTO
log
(
text
)
VALUES
(
'
"
.
$this
-
>
getMessage().
"
'
)
"
);
}
public
function
showError()
{
return
'
<
div
style
=
"
color
:
red
"
>
'
.
$this
-
>
getMessage().
'
<
/
div
>
'
;
}
}
try
{
throw
new
MyException('
ceci
est
faux
'
);
}
catch
(MyException $myException
)
{
$myException
-
>
addLog();
$myException
-
>
showError();
}
?>
Ici, on utilise la classe MyException, qui va insérer un log dans une table, puis afficher un message formaté.
On voit donc qu'il est possible de créer une gestion complète en fonction du type d'exception soulevée. Les classes d'Exception permettent de travailler sur un contexte plutôt que sur un script complet. Ainsi, dans un même script, on peut avoir une classe d'exception pour les erreurs lièes au SGBD, une classe pour les erreurs XML, une classe pour les erreurs système, une classe pour les erreurs utilisateur.....
try
{
if ( $x
)
{
throw new MyException('
ceci
est
faux
'
);
}
$xml
=
new DomDocument();
$sql
=
new SQLiteDatabase( $filename
);
}
catch(MyException $myException
)
{
$myException
-
>
addLog();
$myException
-
>
showError();
}
catch(DOMException $myDOMException
)
{
echo '
Erreur
XML
'
;
}
catch(SQLiteException $mySQLIteException
)
{
echo '
erreur
SQL
'
;
}
Si x == false, nous lancerons l'exception MyException comme nous l'avons défini manuellement. Mais nous pouvons aussi attraper 2 exceptions que nous ne connaissons pas. Ces exceptions sont définies respectivement dans les extensions DOM et SQLITE. En effet, certaines extensions possèdent leur propre classe d'Exception, facilitant le travail du développeur en lui évitant de se demander comment accéder aux données à afficher en cas d'erreur. Ceci reflète ce qui a été dit au I-B, c'est-à-dire que les fonctions et classes lancent elles-mêmes leurs exceptions, qui sont attrapées par le développeur dans le code plutôt que dans les fonctions/classes elles-mêmes.