Table des matières
Note :
Les règles de codage s'applique à tout le code
de l'application de Ganesha.
Nous nous sommes basés sur le manuel de PEAR.
Structures de Contrôles
Les structures de contrôles incluent les 'if', 'for',
'while', 'switch', etc. Vous trouverez ici un exemple de structure
'if'
qui est la plus compliquée :
if ((condition1) || (condition2)) {
action1;
} elseif ((condition3) && (condition4)) {
action2;
} else {
defaultaction;
}
|
Les instructions de contrôle doivent avoir un espace
entre le mot clé de l'instruction et la parenthèse ouvrante,
afin de ne pas les confondre avec des appels de fonction.
Il est vivement recommandé de toujours utiliser
des parenthèses, même dans les situations où elles sont techniquement
optionnelles.
Leur présence augmente la lisibilité du code et réduit le risque
d'erreur logique lors de l'ajout de nouvelles lignes de code.
Pour l'instruction "switch" :
switch (condition) {
case 1:
action1;
break;
case 2:
action2;
break;
default:
defaultaction;
break;
}
|
Appels de Fonction
Les fonctions doivent être appelées sans espaces
entre le nom de la fonction, la parenthèse ouvrante et le premier
paramètre;
avec un espace entre la virgule et chaque paramètre; et aucun espace
entre le dernier paramètre, la parenthèse fermante
et le point virgule.
Voici un exemple :
$var = foo($bar, $baz, $quux);
|
Comme montré ci-dessus, il doit y avoir un espace
de chaque côté du signe égal utilisé pour affecter la valeur de
retour de
la fonction à une variable. Dans le cas d'un bloc d'instructions
similaires, des espaces supplémentaires peuvent être ajoutés
pour améliorer la lisibilité :
$short = foo($bar);
$long_variable = foo($baz);
|
Définitions des
Fonctions
La déclaration des fontions respecte l'indentation
classique des parenthèses :
function fooFunction($arg1, $arg2 = '') {
if (condition) {
statement;
}
return $val;
}
|
Les arguments possèdant des valeurs par défaut vont à la
fin de la liste des arguments. Il faut toujours chercher à retourner
une valeur ayant un sens lorsque cela est possible. Voici un exemple
un peu plus long :
function connect(&$dsn, $persistent = false) {
if (is_array($dsn)) {
$dsninfo = &$dsn;
} else {
$dsninfo = DB::parseDSN($dsn);
}
if (!$dsninfo || !$dsninfo['phptype']) {
return $this->raiseError();
}
return true;
}
|
Commentaires
La documentation des classes incluse dans le source
code doit suivre la convention PHPDocumentor, similaire à celle
de Javadoc.
Pour plus d'informations au sujet de PHPDocumentor vous reporter à : http://www.phpdoc.org ou
http://phpdocu.sourceforge.net
Les commentaires non inclus dans la documentation
sont vivement encouragés. La règle générale est que, si en regardant
une portion de code, vous pensez "Wououh, je ne veux pas me lancer
dans cette explication", il faut absolument la
commenter tout de suite avant que vous oubliez comment cela fonctionne.
Les commentaires du type C (/* */) et les commentaires
standard C++ (//) sont tous les deux acceptés.
Les commentaires de type Perl/shell (#) sont à éviter.
Exemple de commentaires pour une fonction :
/**
* Retourne le nombre de documents poste par un membre
* @param integer $idu id du membre
* @param integer $idg id du groupe
* @return integer Retourne le nombre de documents poste par un membre
* @access public
*/ |
Exemple de commentaires pour une classe :
/** * Fournit une API pour acceder aux chapitres. * @author Georges Caldeira <gcaldeira@anemalab.org> * @access public * @package GaneshaClass */
|
Exemple de commentaires pour un fichier :
/** * Gestion des chapitres * @author Georges Caldeira <gcaldeira@anemalab.org> * @package GaneshaClass */
|
Inclure du Code
A chaque endroit où vous voulez inclure de façon
inconditionnelle un fichier de classe, utilisez require_once().
A chaque endroit où vous voulez inclure de façon conditionnelle
un fichier de classe (par exemple des méthodes de construction),
utilisez include_once(). Ces deux méthodes
s'assurent que le fichier de classe n'est inclu qu'une seule fois.
Un fichier inclu
avec require_once() ne sera pas inclu une
seconde fois par include_once().
Note : include_once() et require_once() sont des instructions, pas des fonctions.
Vous n'avez pas besoin de
parenthèses autour du nom de fichier à inclure.
L'Equipe de développement d'Anéma a fait le choix
d'inclure systématiquement toutes les classes et tous les
modules. Ces deux fichiers se nomment common.inc.php .
Exemple pour les classes Ganesha :
require_once
($class_path."bdd.class.php")
require_once ($class_path.'norme.class.php')
require_once ($class_path."chapitre.class.php")
require_once ($class_path."connexion.class.php")
require_once ($class_path."document.class.php")
require_once ($class_path."formation.class.php")
require_once ($class_path."groupe.class.php")
require_once ($class_path."mail.class.php")
require_once ($class_path."membre.class.php")
require_once ($class_path."module.class.php")
require_once ($class_path."tracking.class.php")
require_once ($class_path."webmail.class.php")
require_once ($class_path."color.class.php")
require_once ($class_path."stats.class.php")
require_once ($class_path."excelgen.class.php")
require_once ($class_path."log.class.php")
require_once ($class_path."news.class.php")
require_once ($class_path."phorum.class.php")
require_once ($class_path."evalannexes.class.php")
require_once ($class_path."session.class.php")
require_once ($class_path."admin.class.php")
require_once ($class_path."bno.class.php") |
;
;
;
;
;
;
;
;
;
;
;
;
;
; // PEAR : Voir le fichier
; // Erh-Wen,Kuo (erhwenkuo@yahoo.com)
;
;
;
; // Eric Villard < evillard@nef.fr >
;
;
; // pyg_listes@exiup.com |
Tags dans le Code
PHP
Toujours utiliser <?PHP ...... ?> pour
délimiter
du code PHP, et non la version abrégée <? ........
?>.
C'est la méthode la plus portable pour
inclure du code PHP sur différents systèmes d'exploitation
et configurations.
Utilisation de PhpLib pour
la connexion à la base de données
Ganesha a été developpée sur un modèle 3-tiers.
Nous avons utilisé PhpLib pour
la couche d'abstraction d'accès à la base de données. Tout développement
dans Ganesha implique l'utilisation de cette couche.
Exemple :
function Nb($idg) {
global $TBL, $db ;
$sSQL = "SELECT id FROM ".$TBL['document']." WHERE groupe=".$idg ;
$db->query($sSQL) ;
return($db->num_rows()) ;
}
|
|