|EN?|FR|

Voici les normes à respecter pour contribuer en PHP.

Normes de base

On va utiliser des tabulations au lieu d'espaces pour la mise en forme.

{TAB} = Tabulation
  = espace

Les fichiers doivent être au format UNIX et non DOS. C'est à dire pour example que les fins de lignes sont des "\n" et non des "\n\r".

L'encodage des fichiers devra être de préférence en UTF-8, ceci aide l'écriture de tout les echanges avec le format XML et l' AJAX.

Les entêtes

Voici comment doit être écrit l'entête d'un fichier :

<?php
/*
 * Centreon is developped with GPL Licence 2.0 :
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
 * Developped by : Julien Mathis - Romain Le Merlus 
 * 
 * The Software is provided to you AS IS and WITH ALL FAULTS.
 * Centreon makes no representation and gives no warranty whatsoever,
 * whether express or implied, and without limitation, with regard to the quality,
 * any particular or intended purpose of the Software found on the Centreon web site.
 * In no event will Centreon be liable for any direct, indirect, punitive, special,
 * incidental or consequential damages however they may arise and even if Centreon has
 * been previously advised of the possibility of such damages.
 * 
 * For information : contact@centreon.com
 */

/*
 * {DESCRIPTION}
 *
 * PHP version 5
 *
 * @package {PACKAGE_NAME}
 * @version $Id: $
 * @copyright (c) 2007-2008 Centreon
 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
 */
?>

Les instruction require, include

Pour les instrutions du style require, include, ... on ne positionera pas de parenthèses.

  • Bon
<?php
require 'Toto.php';
?>
  • Mauvais
<?php
require('Toto.php');
?>

Les variables

Pour le nomage des variables, la norme est que la première lettre est en minuscule et que la lettre de chaque mot soit majuscule ensuite et le tout attaché.

  • Bon
<?php
$maVariable;
?>
  • Mauvais
<?php
$ma_variable;
$MaVariable;
$mavariable;
?>

Les structures de contôles

Les structures de contrôles sont toujours écrites avec les { } .

Examples de structues :

<?php
if ($toto == 'titi') {
{TAB}mon_action;
} elseif (($tutu == 'tutu') && !$titi) {
{TAB}mon_action2;
}

while ($tutu < 20) {
{TAB}mon_action3;
}

switch ($test) {
{TAB}case 'tutu':
{TAB}{TAB}mon_action4;
{TAB}{TAB}break;
{TAB}default:
{TAB}{TAB}mon_action5;
{TAB}{TAB}break;
}
?>

Les fonctions

Pour le nomage des fonctions, la norme est que la première lettre est en minuscule et que la lettre de chaque mot soit majuscule ensuite et le tout attaché.

  • Bon
<?php
function maFonction($toto, $titi = '') {
{TAB}definition;
}
?>
  • Mauvais
<?php
function ma_fonction($toto, $titi = '') {
{TAB}definition;
}
?>


<?php
function MaFonction($toto, $titi = '') {
{TAB}definition;
}
?>

La documentation comme si dessous :

<?php
/*
 * {DESCRIPTION_COURTE}
 *
 * {DESCRIPTION_LONGUE} (s'il y en a besoin)
 *
 * <code>
 * Un exemple d'utilisation si besoin
 * </code>
 *
 * @param{TAB}int{TAB}$argument1{TAB}Mon premier argument
 * @param{TAB}string{TAB}$argument2{TAB}Mon deuxième argument
 * @return{TAB}int{TAB}Ma valeur de retour
 */
function maFunction($argument1, $argument2 = '') {
{TAB}actions
{TAB}return $valeur;
}
?>

Les classes

Pour les noms des classes, la norme est que la première de chaque mot soit en majuscule et le tout attaché. Le nom d'une classe commence toujours par Centreon.

  • Bon
<?php
class CentreonMaClasse
{
}
?>
  • Mauvais
<?php
class Ma_Classe
{
}

class maClasse
{
}

class ma_classe
{
}
?>

Les fonctions et les variables dans les classes doivent être préfixées par 'public', 'private', 'protected'. Le nom des variables commencent par un _ quand celle-ci est privée.

Pour la documentation, il faut reprendre les informations de bases.

<?php
/*
 * {DESCRIPTION_COURTE}
 *
 * {DESCRIPTION_LONGUE}
 *
 * @package {PACKAGE_NAME}
 * @version Release: {VERSION}
 */
class MaClass
{
{TAB}/*
{TAB} * {DESCRIPTION}
{TAB} * 
{TAB} * @var string
{TAB} * @access private
{TAB} */
{TAB}private $_var1;

{TAB}/*
{TAB} * {DESCRIPTION_COURTE}
{TAB} *
{TAB} * {DESCRIPTION_LONGUE} (s'il y en a besoin)
{TAB} *
{TAB} * <code>
{TAB} * Un exemple d'utilisation si besoin
{TAB} * </code>
{TAB} *
{TAB} * @access public
{TAB} * @param{TAB}int{TAB}$arg{TAB}Mon argument
{TAB} * @return{TAB}int{TAB}Ma valeur de retour
{TAB} * @deprecated Method deprecated in Release 2 (si besoin)
{TAB} */
{TAB}public function maFonction($arg) {
{TAB}{TAB}return 1;
{TAB}}
}
?>

Une petite exception pour le nom des classes, on peut avoir un _ quand la classe fait partie d'un sous-ensemble.

Example :

La gestion de l'authentification

<?php
class CentreonAuth
{
}
?>

Pour l'authentification par la base de données, elle dépend de la classe précédante.

<?php
class CentreonAuth_DB
{
}
?>

Le nommage des fichiers sera le nom de la classe, pour les classes d'un groupe on utilisera un répertoire.

Exemple :

  • class CentreonAuth => CentreonAuth.php
  • class CentreonAuth_DB => CentreonAuth/DB.php

La gestion des erreurs

Pour la gestion des erreurs, on préférera lever une exception que de faire un retour alternatif.

Il faut penser à mettre dans la documentation l'exception :

<?php
/*
 * Ma fonction qui léve une exception
 *
 * @throws Exception Description
 * @return string Ma chaine de retour
 */
function maFonction() {
{TAB}if (!$ok) {
{TAB}{TAB}throw new Exception('Erreur');
{TAB}}
{TAB}return 'Ca marche';
}
?>

Les requêtes SQL

Pour les requêtes SQL, on essayera de passer par des prepare statement dans la plus part des cas.

Ensuite on formatera le code comme il suit :

<?php
$sql = "SELECT `name`, `value`
{TAB}FROM `table_name`
{TAB}WHERE `id` = :id AND `enabled` = :enable";


$sql = "SELECT `name`, `value`
{TAB}FROM `table_name`
{TAB}WHERE `id` = :id AND `enabled` = :enable
{TAB}{TAB}AND `valid` = 1
{TAB}ORDER BY `name`";

$sql = "INSERT INTO `table_name`
{TAB}(`name`, `value`)
{TAB}VALUES (:name, :value)";

$sql = "UPDATE `table_name`
{TAB}SET `value` = :value
{TAB}WHERE `name` = :name";
?>

Il est aussi obligatoire d'encadrer les noms de champs et noms de tables par des `.

Optimisations

Voici une série de fonctions à utiliser de préférence par rapport à d'autre :

Bonne Mauvaise
count sizeof
is_int is_integer
rtrim chop
floatval doubleval
fputs fwrite
implode join
ini_set ini_alter

Merci aussi de ne pas utiliser les fonctions suivantes :

  • array_key_exists

Source : http://torrentialwebdev.com/blog/archives/116-7-tips-for-lightning-fast-PHP-sites.html

Exemple

Une classe d'exemple?