{"id":682,"date":"2014-07-28T08:16:56","date_gmt":"2014-07-28T06:16:56","guid":{"rendered":"http:\/\/blog.sylabe.org\/?page_id=682"},"modified":"2014-07-28T08:16:56","modified_gmt":"2014-07-28T06:16:56","slug":"programmation","status":"publish","type":"page","link":"http:\/\/blog.sylabe.org\/?page_id=682","title":{"rendered":"Programmation"},"content":{"rendered":"<h1>Programmation<\/h1>\n<p>&nbsp;<\/p>\n<p>Le passage en <a title=\"Programmation orient\u00e9e objet\" href=\"http:\/\/blog.sylabe.org\/?p=648\" target=\"_blank\">programmation PHP orient\u00e9e objet<\/a> est toujours en cours.<\/p>\n<p style=\"text-align: justify;\">Je vais essayer ici de condenser les cours en r\u00e8gles simple, une sorte d&rsquo;aide m\u00e9moire.<\/p>\n<ol>\n<li>La programmation orient\u00e9e objet<\/li>\n<li>La convention de codage PEAR<\/li>\n<li>Les principes SOLID<\/li>\n<li>Le paradigme MVC<\/li>\n<li>La mod\u00e9lisation UML<\/li>\n<\/ol>\n<p style=\"text-align: center;\"><strong><span style=\"color: #ff0000;\"><span style=\"text-decoration: underline;\"><strong>\/!<\/strong><\/span> &#8211; En cours de r\u00e9daction -\u00c2\u00a0 <span style=\"text-decoration: underline;\">\/!<\/span><\/span><\/strong><\/p>\n<p style=\"text-align: center;\"><!--more--><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-661 aligncenter\" alt=\"sylabe.ico\" src=\"\/wp-content\/uploads\/sylabe\/2014\/07\/sylabe.ico1.png\" width=\"32\" height=\"32\" \/><\/p>\n<h2 style=\"text-align: justify;\">La programmation orient\u00e9e objet<\/h2>\n<p style=\"text-align: justify;\">CF : <a href=\"http:\/\/fr.openclassrooms.com\/informatique\/cours\/programmez-en-oriente-objet-en-php\" target=\"_blank\">http:\/\/fr.openclassrooms.com\/informatique\/cours\/programmez-en-oriente-objet-en-php<\/a> &#8211; <a href=\"http:\/\/jcrozier.developpez.com\/tutoriels\/web\/php\/programmation-orientee-objet\/\" target=\"_blank\">http:\/\/jcrozier.developpez.com\/tutoriels\/web\/php\/programmation-orientee-objet\/<\/a> &#8211; <a href=\"http:\/\/alain-sahli.developpez.com\/tutoriels\/php\/les-interfaces\/\" target=\"_blank\">http:\/\/alain-sahli.developpez.com\/tutoriels\/php\/les-interfaces\/<\/a> &#8211; <a href=\"http:\/\/stephaneey.developpez.com\/tutoriel\/php\/php5_nouveautes\/\" target=\"_blank\">http:\/\/stephaneey.developpez.com\/tutoriel\/php\/php5_nouveautes\/<\/a> &#8211; <a title=\"Livre PHP 5 avanc\u00e9\" href=\"http:\/\/www.eyrolles.com\/Informatique\/Livre\/php-5-avance-9782212134353\" target=\"_blank\">Livre PHP 5 avanc\u00e9<\/a><\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Les classes<\/h3>\n<p style=\"text-align: justify;\">Une <strong>classe<\/strong> contient des <strong>attributs<\/strong> (variables) et des <strong>m\u00e9thodes<\/strong> (fonctions). Les classes servent de mod\u00e8le pour les objets.<\/p>\n<pre>class MaClasse\n{\n    ...\n}<\/pre>\n<p style=\"text-align: justify;\"><em>Convention de nommage PEAR<\/em> : Les d\u00e9claration de classes ouvrent l&rsquo;accolade sur une nouvelle ligne. Les classes doivent avoir un nom parlant. \u00e9viter les abr\u00e9viations lorsque cela est possible. Les noms de classes doivent toujours commencer par une majuscule. L&rsquo;architecture hi\u00e9rarchique des classes PEAR se retrouve aussi dans le nom de la classe, chaque niveau de la hi\u00e9rarchie \u00e9tant s\u00e9par\u00e9 par un unique trait soulign\u00e9 &lsquo;_&rsquo;.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Les m\u00e9thodes<\/h3>\n<p style=\"text-align: justify;\">Dans une classe, une m\u00e9thode est une <strong>fonction<\/strong>. Une m\u00e9thode peut \u00eatre :<\/p>\n<ul>\n<li><strong>publique<\/strong> : visible en dehors de la classe.<\/li>\n<li><strong>prot\u00e9g\u00e9<\/strong> : visible dans les classes enfants.<\/li>\n<li><strong>priv\u00e9<\/strong> : visible unique de la classe.<\/li>\n<li><strong>statique<\/strong> (en plus) : commune \u00e0 la classe, et donc partag\u00e9e par toutes les instances.<\/li>\n<li><strong>finale<\/strong> (en plus) : ne peut pas \u00eatre remplac\u00e9e dans une classe enfant.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Les m\u00e9thodes devraient \u00eatre par d\u00e9faut publiques ou prot\u00e9g\u00e9es pour \u00eatre utilisables par les classes enfants.<\/p>\n<pre>class MaClasse\n{\n    public function $ajouterNombre() { ... }\n    protected function $soustraireNombre() { ... }\n    private function $_supprimerNombre() { ... }\n    public static function $ajouterStaticNombre() { ... }\n    protected static function $soustraireStaticNombre() { ... }\n    private static function $_supprimerStaticNombre() { ... }\n    public final function $ajouterFinalNombre() { ... }\n    protected final function $soustraireFinalNombre() { ... }\n    private final function $_supprimerFinalNombre() { ... }\n}<\/pre>\n<p style=\"text-align: justify;\">Il existe des m\u00e9thodes dites magiques. Celles-ci ont des noms pr\u00e9d\u00e9finis commen\u00e7ant par un double soulign\u00e9 &lsquo;<code>__<\/code>&lsquo; et sont utilis\u00e9es par d\u00e9faut si pr\u00e9sentes lors de certaines op\u00e9rations.<\/p>\n<p style=\"text-align: justify;\"><em>Convention de nommage PEAR<\/em> : Les arguments poss\u00e9dant des valeurs par d\u00e9faut vont \u00e0 la fin de la liste des arguments. Il faut toujours chercher \u00e0 retourner une valeur ayant un sens lorsque cela est possible. Les m\u00e9thodes doivent \u00eatre nomm\u00e9es en utilisant le style \u00ab\u00a0studly caps\u00a0\u00bb, c&rsquo;est \u00e0 dire l&rsquo;utilisation de majuscules en milieu de mot pour marquer visuellement la s\u00e9paration entre les mots sans utiliser d&rsquo;espaces ou s\u00e9parateurs. Les m\u00e9thodes priv\u00e9s d&rsquo;une classe sont pr\u00e9c\u00e9d\u00e9s d&rsquo;un simple soulign\u00e9 &lsquo;_&rsquo;. Les m\u00e9thodes prot\u00e9g\u00e9s d&rsquo;une classe ne sont pas pr\u00e9c\u00e9d\u00e9s par un soulign\u00e9 &lsquo;_&rsquo;.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Les attributs<\/h3>\n<p style=\"text-align: justify;\">Dans une classe, un attribut est une <strong>variable<\/strong>. Un attribut peut \u00eatre :<\/p>\n<ul>\n<li><strong>publique<\/strong> : visible en dehors de la classe.<\/li>\n<li><strong>prot\u00e9g\u00e9<\/strong> : visible dans les classes enfants.<\/li>\n<li><strong>priv\u00e9<\/strong> : visible unique de la classe.<\/li>\n<li><strong>statique<\/strong> (en plus) : valeur commune \u00e0 la classe, et donc valeur partag\u00e9e par toutes les instances.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Les attributs doivent \u00eatre par d\u00e9faut priv\u00e9s ou prot\u00e9g\u00e9s pour \u00eatre utilisables par les classes enfants.<\/p>\n<pre>class MaClasse\n{\n    public $variablePublic;\n    protected $variableProtegee;\n    private $_variablePrivee;\n    public static $variableStaticPublic;\n    protected static $variableStaticProtegee;\n    private static $_variableStaticPrivee;\n    const AXIOM_AJOUTER = 1;\n}<\/pre>\n<p style=\"text-align: justify;\">On ne doit pas utiliser d&rsquo;attributs publiques. On acc\u00e8de aux attributs via des m\u00e9thodes afin de pouvoir mieux contr\u00f4ler leur consultation et modification.<\/p>\n<p style=\"text-align: justify;\"><em>Convention de nommage PEAR<\/em> : Les attributs doivent \u00eatre nomm\u00e9es en utilisant le style \u00ab\u00a0studly caps\u00a0\u00bb, c&rsquo;est \u00e0 dire l&rsquo;utilisation de majuscules en milieu de mot pour marquer visuellement la s\u00e9paration entre les mots sans utiliser d&rsquo;espaces ou s\u00e9parateurs. Les attributs priv\u00e9s d&rsquo;une classe sont pr\u00e9c\u00e9d\u00e9s d&rsquo;un simple soulign\u00e9 &lsquo;_&rsquo;. Les attributs prot\u00e9g\u00e9s d&rsquo;une classe ne sont pas pr\u00e9c\u00e9d\u00e9s par un soulign\u00e9 &lsquo;_&rsquo;. Les constantes doivent toujours \u00eatre en majuscule, les mots s\u00e9par\u00e9s par des &lsquo;_&rsquo;. Pr\u00e9fixez les noms des constantes avec le nom en majuscule de la classe\/paquetage dans laquelle elles sont utilis\u00e9es.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3>Les objets (instances)<\/h3>\n<p><strong>Cr\u00e9er une instance<\/strong> \u00e0 partir d&rsquo;une classe, l&rsquo;instanciation d&rsquo;une classe, c&rsquo;est <strong>cr\u00e9er un objet<\/strong>. Cet objet contient par h\u00e9ritage tous les attributs et m\u00e9thodes de la classe utilis\u00e9e et des classes parents. Cet objet est autonome, ses attributs ont des valeurs sp\u00e9cifique \u00e0 cet objet. Un autre objet aura les m\u00eames attributs mais avec des valeurs diff\u00e9rentes.<\/p>\n<pre>classe MaClass\n{\n    ...\n}\n$objet = new MaClasse();<\/pre>\n<p style=\"text-align: justify;\">Lors de la cr\u00e9ation de l&rsquo;objet, si la m\u00e9thode magique <code>__construct<\/code> est pr\u00e9sente, elle est appel\u00e9e.<\/p>\n<p style=\"text-align: justify;\">On peut v\u00e9rifier qu&rsquo;une variable est bien un objet instanci\u00e9 d&rsquo;un certaine classe :<br \/>\n<code>if ($objet instanceof MaClass) { ... }<\/code><\/p>\n<p style=\"text-align: justify;\">Pour supprimer proprement un objet, on utiliser <code>unset($objet)<\/code> qui utilise la m\u00e9thode magique <code>__destruct<\/code> si pr\u00e9sente.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Utiliser les m\u00e9thodes dans les objets<\/h3>\n<p style=\"text-align: justify;\">Dans un objet, les m\u00e9thodes non statiques sont accessibles via <code>$this-&gt;methode($parametres)<\/code>. <code>$this<\/code> est un mot cl\u00e9 qui d\u00e9signe l&rsquo;objet en cours. <code>methode<\/code> d\u00e9signe la m\u00e9thode que l&rsquo;on souhaite utiliser. <code>$parametres<\/code> d\u00e9signe le ou les param\u00e8tres que l&rsquo;on veut transmettre \u00e0 la m\u00e9thode.<br \/>\nEn dehors de l&rsquo;objet, les m\u00e9thodes publiques (<code>public<\/code>) sont accessible via <code>$objet-&gt;methode($parametres)<\/code>. <code>$objet<\/code> d\u00e9signe l&rsquo;objet sur lequel on souhaite appliquer la m\u00e9thode.<br \/>\nLes m\u00e9thodes priv\u00e9es (<code>private<\/code>) ne sont pas accessibles en dehors de l&rsquo;objet.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Utiliser les m\u00e9thodes dans les classes<\/h3>\n<p style=\"text-align: justify;\">Une m\u00e9thode statique (<code>static<\/code>) appartient \u00e0 une classe et non aux instances de cette classe.<br \/>\nDans une classe, les m\u00e9thodes statiques (<code>static<\/code>) sont accessibles via <code>self::methode($parametres)<\/code>. <code>self<\/code> est un mot cl\u00e9 qui d\u00e9signe la classe utilis\u00e9e.<br \/>\nEn dehors de la classe, les m\u00e9thodes publiques (<code>public<\/code>) et statiques (<code>static<\/code>) sont accessibles via <code>classe::methode($parametres)<\/code>. <code>classe<\/code> d\u00e9signe la classe utilis\u00e9e.<br \/>\nLes m\u00e9thodes priv\u00e9es (<code>private<\/code>) ne sont pas accessibles en dehors de l&rsquo;objet.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Utiliser les attributs dans les objets<\/h3>\n<p style=\"text-align: justify;\">Dans un objet, les attributs non statiques sont accessibles via <code>$this-&gt;attribut<\/code>. <code>$this<\/code> est un mot cl\u00e9 qui d\u00e9signe l&rsquo;objet en cours. <code>attribut<\/code> d\u00e9signe l&rsquo;attribut que l&rsquo;on souhaite utiliser.<br \/>\nEn dehors de l&rsquo;objet, les attributs publics (<code>public<\/code>) sont accessible via <code>$objet-&gt;attribut<\/code>. <code>$objet<\/code> d\u00e9signe l&rsquo;objet sur lequel on souhaite appliquer la m\u00e9thode.<br \/>\nLes attributs priv\u00e9s (<code>private<\/code>) ne sont pas accessibles en dehors de l&rsquo;objet.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Utiliser les attributs dans les classes<\/h3>\n<p style=\"text-align: justify;\">Un attribut statique (<code>static<\/code>) appartient \u00e0 une classe et non aux instances de cette classe. Tous les objets instanci\u00e9s de la classe utilisent le m\u00eame attribut avec son contenu commun.<br \/>\nDans une classe, les attributs statiques (<code>static<\/code>) sont accessibles via <code>self::$attribut<\/code>. <code>self<\/code> est un mot cl\u00e9 qui d\u00e9signe la classe utilis\u00e9e. <code>$attribut<\/code> d\u00e9signe l&rsquo;attribut que l&rsquo;on souhaite utiliser.<br \/>\nEn dehors de la classe, les attributs publics (<code>public<\/code>) et statiques (<code>static<\/code>) sont accessibles via <code>classe::$attribut<\/code>. <code>classe<\/code> d\u00e9signe la classe utilis\u00e9e.<br \/>\nLes attributs priv\u00e9s (<code>private<\/code>) ne sont pas accessibles en dehors de l&rsquo;objet.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Utiliser les variables hors des objets<\/h3>\n<p style=\"text-align: justify;\">Dans un objet, une m\u00e9thode fonctionne comme une fonction. Si on a besoin d&rsquo;utiliser une variable d\u00e9fini hors des classes et objets, il faut l&rsquo;appeler comme on l&rsquo;appellerais depuis une fonction classique, c&rsquo;est \u00e0 dire :<\/p>\n<pre>class MaClasse\n{\n    public function maFonction()\n    {\n        global $maVariableGlobale;\n        echo $maVariableGlobale;\n    }\n}<\/pre>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Utiliser les constantes<\/h3>\n<p style=\"text-align: justify;\">Une constante appartient \u00e0 une classe et non aux instances de cette classe. Un constante est forc\u00e9ment publique et non modifiable.<br \/>\nDans une instance de la classe, les constantes sont accessibles via <code>self::CONSTANTE<\/code>. <code>self<\/code> d\u00e9signe la classe utilis\u00e9e. <code>CONSTANTE<\/code> d\u00e9signe la constante que l&rsquo;on souhaite utiliser.<br \/>\nEn dehors de l&rsquo;instance de la classe, les constantes sont accessibles via <code>classe::methode($parametres)<\/code>. <code>classe<\/code> d\u00e9signe la classe utilis\u00e9e. <code>CONSTANTE<\/code> d\u00e9signe la constante que l&rsquo;on souhaite utiliser.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3>Les classes enfants et l&rsquo;h\u00e9ritage<\/h3>\n<p style=\"text-align: justify;\">Une <strong>classe enfant h\u00e9rite<\/strong> automatiquement de <strong>tous les attributs et m\u00e9thodes<\/strong> de la classe parent. De nouveaux attributs et m\u00e9thodes peuvent \u00eatre ajout\u00e9s.<br \/>\nUn attribut avec une valeur par d\u00e9faut peut \u00eatre remplac\u00e9 pour avoir une nouvelle valeur, mais le type d&rsquo;attribut doit \u00eatre le m\u00eame.<br \/>\nUne m\u00e9thode peut \u00eatre remplac\u00e9e par une nouvelle si la m\u00e9thode de la classe parente n&rsquo;est pas marqu\u00e9e comme finale (final). Une m\u00e9thode remplac\u00e9e doit de plus avoir les m\u00eame arguments, tout au plus peut-on ajouter des arguments optionnels, c\u00e0d avec une valeur par d\u00e9faut.<\/p>\n<pre>class MaClasse\n{\n    ...\n}\nclass MaClasseEnfant extends MaClasse\n{\n    ...\n}<\/pre>\n<p style=\"text-align: justify;\">On peut appeler une m\u00e9thode de la classe parente plut\u00f4t que la m\u00eame m\u00e9thode red\u00e9finie par la classe fille avec <code>parent::methode()<\/code>, cependant c&rsquo;est un grand risque de confusion, \u00e0 \u00e9viter donc.<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3>Les classes abstraites<\/h3>\n<p style=\"text-align: justify;\">Une <strong>classe abstraite<\/strong> est une classe qui <strong>ne peut pas \u00eatre utilis\u00e9e directement<\/strong> pour faire des objets. Mais elle permet de d\u00e9finir certains attributs et m\u00e9thodes par d\u00e9faut pour des classes enfants.<\/p>\n<pre>abstract class MaClasse\n{\n    ...\n}\nclass MaClasseEnfant extends MaClasse\n{\n    ...\n}<\/pre>\n<p style=\"text-align: center;\">::<\/p>\n<h3>Les interfaces<\/h3>\n<p style=\"text-align: justify;\">L&rsquo;<strong>interface<\/strong> est un <strong>contrat<\/strong> de <strong>service minimum<\/strong>. Une classe qui pr\u00e9tend utiliser une interface est tenu d&rsquo;impl\u00e9menter tous les <strong>m\u00e9thodes publiques<\/strong> d\u00e9finis dans l&rsquo;interface. C&rsquo;est une bonne pratique de programmation pour les gros projets avec de multiples intervenants et beaucoup de classes similaires.<\/p>\n<pre>interface interfaceDeClasse\n{\n    public $variablePublic;\n    public function $ajouterNombre();\n}\nclass MaClasse implements interfaceDeClasse\n{\n    public $variablePublic;\n    public function $ajouterNombre()\n    {\n        ...\n    }\n}<\/pre>\n<p style=\"text-align: justify;\">Une classe peut d\u00e9pendre de plusieurs interfaces. Les interfaces sont s\u00e9par\u00e9es par une virgule : <code>class MaClasse implements interfaceDeClasse1, interfaceDeClasse2<\/code><\/p>\n<p style=\"text-align: justify;\">Une ou plusieurs interfaces peuvent \u00e9tendre une interface. Les interfaces sont s\u00e9par\u00e9es par une virgule : <code>interface interfaceDeClasse extends interfaceDeClasse1, interfaceDeClasse2<\/code><\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Les <em>getter<\/em> et <em>setter<\/em><\/h3>\n<p style=\"text-align: justify;\">A faire&#8230;<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Les constructeurs et d\u00e9-constructeurs<\/h3>\n<p style=\"text-align: justify;\">A faire&#8230;<\/p>\n<p style=\"text-align: center;\">::<\/p>\n<h3 style=\"text-align: justify;\">Copie et clonage d&rsquo;objets<\/h3>\n<p style=\"text-align: justify;\">Par d\u00e9faut en PHP5, un objet est toujours transmis par r\u00e9f\u00e9rence. Copier un objet dans une nouvelle variable n&rsquo;est fait pas un nouvelle objet, on utiliser toujours le m\u00eame objet.<br \/>\n<code>$objet2 = $objet;<\/code><br \/>\nPour en faire une vraie copie autonome, il faut explicitement demander \u00e0 en faire un clone :<br \/>\n<code>$objet3 = clone $objet;<\/code><br \/>\nIl est possible de d\u00e9finir la m\u00e9thode magique <code>__clone<\/code> pour forcer certaines op\u00e9rations lorsque l&rsquo;on clone un objet. Par exemple, si chaque objet doit avoir un ID unique.<\/p>\n<p style=\"text-align: justify;\">Pour tester si deux objets sont \u00e9gaux dans leur contenus, on utilise le double \u00e9gal &lsquo;<code>==<\/code>&lsquo; :<br \/>\n<code>if ($objet2 == $objet1) { ... }<\/code><br \/>\nPour tester si deux variables contiennent le m\u00eame objet, et pas juste leur contenu, on utiliser le triple \u00e9gal &lsquo;<code>===<\/code>&lsquo; :<br \/>\n<code>if ($objet2 === $objet1) { ... }<\/code><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-661 aligncenter\" alt=\"sylabe.ico\" src=\"\/wp-content\/uploads\/sylabe\/2014\/07\/sylabe.ico1.png\" width=\"32\" height=\"32\" \/><\/p>\n<h2 style=\"text-align: justify;\">La convention de codage PEAR<\/h2>\n<p style=\"text-align: justify;\">CF : <a title=\"Convention de codage PEAR\" href=\"http:\/\/pear.php.net\/manual\/fr\/standards.php\" target=\"_blank\">http:\/\/pear.php.net\/manual\/fr\/standards.php<\/a><\/p>\n<ol>\n<li style=\"text-align: justify;\"><strong>Indentation et longueur de lignes.<\/strong> Utilisez une indentation des 4 espaces, sans tabulation.<\/li>\n<li style=\"text-align: justify;\"><strong>Structures de Contr\u00f4les.<\/strong> Les instructions de contr\u00f4le doivent avoir un espace entre le mot cl\u00e9 de l&rsquo;instruction et la parenth\u00e8se ouvrante, afin de les distinguer des appels de fonctions. Il est vivement recommand\u00e9 de toujours utiliser des accolades, m\u00eame dans les situations o\u00f9 elles sont techniquement optionnelles.<\/li>\n<li style=\"text-align: justify;\"><strong>Appels de Fonctions.<\/strong> Les fonctions doivent \u00eatre appel\u00e9es sans espace entre le nom de la fonction, la parenth\u00e8se ouvrante, et le premier param\u00e8tre ; avec un espace entre la virgule et chaque param\u00e8tre et aucun espace entre le dernier param\u00e8tre, la parenth\u00e8se fermante et le point virgule. Il doit y avoir au moins un espace de chaque c\u00f4t\u00e9 du signe \u00e9gal utilis\u00e9 pour affecter la valeur de retour de la fonction \u00e0 une variable.<\/li>\n<li style=\"text-align: justify;\"><strong>D\u00e9finitions des classes.<\/strong> Les d\u00e9claration de classes ouvrent l&rsquo;accolade sur une nouvelle ligne.<\/li>\n<li style=\"text-align: justify;\"><strong>D\u00e9finitions des fonctions.<\/strong> Les arguments poss\u00e9dant des valeurs par d\u00e9faut vont \u00e0 la fin de la liste des arguments. Il faut toujours chercher \u00e0 retourner une valeur ayant un sens lorsque cela est possible.<\/li>\n<li style=\"text-align: justify;\"><strong>Commentaires.<\/strong> Les commentaires du type <em>C<\/em> ( <code>\/* *\/<\/code> ) et les commentaires standard <em>C++<\/em> ( <code>\/\/<\/code> ) sont tous les deux accept\u00e9s. Les commentaires de type Perl\/shell (#) sont \u00e0 \u00e9viter.<\/li>\n<li style=\"text-align: justify;\"><strong>Inclure du Code.<\/strong> A chaque endroit o\u00f9 vous voulez inclure de fa\u00e7on inconditionnelle un fichier de classe, utilisez <code>require_once<\/code>. A chaque endroit o\u00f9 vous voulez inclure de fa\u00e7on conditionnelle un fichier de classe (par exemple des m\u00e9thodes de construction), utilisez <code>include_once<\/code>. Ces deux m\u00e9thodes s&rsquo;assurent que le fichier classe n&rsquo;est inclus qu&rsquo;une seule fois.<\/li>\n<li style=\"text-align: justify;\"><strong>Tags dans le Code PHP.<\/strong> Utilisez <i>toujours<\/i> <code>&lt;?php ?&gt;<\/code> pour d\u00e9limiter du code PHP, et non la version abr\u00e9g\u00e9e <code>&lt;? ?&gt;<\/code>.<\/li>\n<li style=\"text-align: justify;\"><strong>Commentaires d&rsquo;En-t\u00eate.<\/strong> Tous les fichiers de code source qui se trouvent dans le d\u00e9p\u00f4t de PEAR doivent contenir le bloc de commentaires d&rsquo;en-t\u00eate : Un bloc de commentaire \u00ab\u00a0page-level\u00a0\u00bb en d\u00e9but de chaque fichier, et un bloc de commentaires \u00ab\u00a0class-level\u00a0\u00bb juste au dessus de chaque classe.<\/li>\n<li style=\"text-align: justify;\"><span style=\"color: #999999;\"><strong>Utilisation de CVS.<\/strong> Inclure le mot cl\u00e9 CVS <code>$Id$<\/code> dans chaque fichier.<\/span><\/li>\n<li style=\"text-align: justify;\"><strong>Exemple d&rsquo;URLs.<\/strong> Utilisez <code>example.com<\/code>, <code>example.org<\/code> et <code>example.net<\/code> pour tous les exemples d&rsquo;URLs et exemples d&#8217;email (<a href=\"http:\/\/www.faqs.org\/rfcs\/rfc2606\">RFC 2606<\/a>).<\/li>\n<li style=\"text-align: justify;\"><strong>Conventions de Nom.<\/strong> Les classes doivent avoir un nom parlant. \u00e9viter les abr\u00e9viations lorsque cela est possible. Les noms de classes doivent toujours commencer par une majuscule. L&rsquo;architecture hi\u00e9rarchique des classes PEAR se retrouve aussi dans le nom de la classe, chaque niveau de la hi\u00e9rarchie \u00e9tant s\u00e9par\u00e9 par un unique trait soulign\u00e9 &lsquo;_&rsquo;. Les attributs et les m\u00e9thodes doivent \u00eatre nomm\u00e9es en utilisant le style \u00ab\u00a0<em>studly caps<\/em>\u00ab\u00a0, c&rsquo;est \u00e0 dire l&rsquo;utilisation de majuscules en milieu de mot pour marquer visuellement la s\u00e9paration entre les mots sans utiliser d&rsquo;espaces ou s\u00e9parateurs. Les fonctions doivent de plus avoir le nom du paquetage comme pr\u00e9fixe, pour \u00e9viter les doublons entre les paquetages. Les \u00e9l\u00e9ments (m\u00e9thodes, attributs) priv\u00e9s d&rsquo;une classe sont pr\u00e9c\u00e9d\u00e9s d&rsquo;un simple soulign\u00e9 &lsquo;_&rsquo;. Les membres prot\u00e9g\u00e9s d&rsquo;une classe ne sont pas pr\u00e9c\u00e9d\u00e9s par un soulign\u00e9 &lsquo;_&rsquo;. Les constantes doivent toujours \u00eatre en majuscule, les mots s\u00e9par\u00e9s par des &lsquo;_&rsquo;. Pr\u00e9fixez les noms des constantes avec le nom en majuscule de la classe\/paquetage dans laquelle elles sont utilis\u00e9es. Si votre paquetage a besoin de d\u00e9finir des variables globales, leurs noms doivent commencer par un simple &lsquo;_&rsquo; suivi par le nom du paquetage et un autre &lsquo;_&rsquo;.<\/li>\n<li style=\"text-align: justify;\"><span style=\"color: #000000;\"><strong>Formats des fichiers.<\/strong> Tous les scripts apport\u00e9s \u00e0 PEAR doivent \u00eatre stock\u00e9s comme du texte ASCII, utiliser le jeux de caract\u00e8res ISO-8859-1, et \u00eatre format\u00e9 Unix. Il ne doit y avoir qu&rsquo;<i>un seul<\/i> retour \u00e0 la ligne apr\u00e8s la fermeture du tag PHP ( <code>?&gt;<\/code> ). Cela signifie que lorsque le curseur est \u00e0 la fin du fichier, il doit y avoir <i>une seule<\/i> apr\u00e8s le tag PHP fermant.<\/span><\/li>\n<li style=\"text-align: justify;\"><strong>E_STRICT-compatible code.<\/strong> Depuis le 1er janvier 2006, tout nouveau code propos\u00e9 pour PEAR doit \u00eatre compatible <code>E_STRICT<\/code>. Cela signifie qu&rsquo;il ne doit pas produire de warning ou d&rsquo;erreur quand le niveau de rapport d&rsquo;erreur de php est au niveau <code>E_STRICT<\/code>.<\/li>\n<li style=\"text-align: justify;\"><strong>Guide de gestion des erreurs.<\/strong> Cette partie d\u00e9finit comment sont prises en compte les erreurs dans les paquetages PEAR programm\u00e9s en PHP 5 et 6.<\/li>\n<li style=\"text-align: justify;\"><strong>Les bonnes pratiques.<\/strong> Il y a d&rsquo;autres choses qui ne sont pas couvertes par la convention de codage PEAR qui sont plus sujettes \u00e0 des pr\u00e9f\u00e9rences personnelles et qui ne sont pas directement li\u00e9es \u00e0 la lisibilit\u00e9 du code. Par exemple, l&rsquo;utilisateur des simples ou des doubles guillemets est permis par PHP lui-m\u00eame afin de rendre la programmation plus simple et il n&rsquo;y a aucune raison d&rsquo;utiliser plut\u00f4t l&rsquo;un que l&rsquo;autre. Ce choix appartient au d\u00e9veloppeur. La seule recommandation que nous pouvons faire est de conserver votre choix dans un m\u00eame paquet et de respecter le style personnel des autres d\u00e9veloppeurs.<\/li>\n<li style=\"text-align: justify;\"><strong>Fichier exemple.<\/strong> CF <a title=\"Fichier exemple\" href=\"http:\/\/pear.php.net\/manual\/fr\/standards.sample.php\" target=\"_blank\">http:\/\/pear.php.net\/manual\/fr\/standards.sample.php<\/a><\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Le point 10 n&rsquo;est pas applicable du fait de l&rsquo;environnement propre \u00e0 <a title=\"Projet nebule\" href=\"http:\/\/www.nebule.org\" target=\"_blank\">nebule<\/a>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-661 aligncenter\" alt=\"sylabe.ico\" src=\"\/wp-content\/uploads\/sylabe\/2014\/07\/sylabe.ico1.png\" width=\"32\" height=\"32\" \/><\/p>\n<h2 style=\"text-align: justify;\">Les principes SOLID<\/h2>\n<p style=\"text-align: justify;\">CF : <a title=\"Les principes SOLID\" href=\"http:\/\/blog.xebia.fr\/2011\/07\/18\/les-principes-solid\/\" target=\"_blank\">http:\/\/blog.xebia.fr\/2011\/07\/18\/les-principes-solid\/<\/a> &#8211; <a title=\"SOLID\" href=\"http:\/\/fr.wikipedia.org\/wiki\/SOLID_%28informatique%29\" target=\"_blank\">http:\/\/fr.wikipedia.org\/wiki\/SOLID_%28informatique%29<\/a><\/p>\n<ul>\n<li style=\"text-align: justify;\"><strong>S<\/strong>ingle responsibility principle. Une classe doit avoir une et une seule responsabilit\u00e9.<\/li>\n<li style=\"text-align: justify;\"><strong>O<\/strong>pen close principle. Une classe doit \u00eatre ouverte \u00e0 l&rsquo;extension, mais ferm\u00e9e \u00e0 la modification.<\/li>\n<li style=\"text-align: justify;\"><strong>L<\/strong>iskov principle. Une classe doit pouvoir \u00eatre remplac\u00e9e par une instance d&rsquo;un de ses sous-types, sans modifier la coh\u00e9rence du programme.<\/li>\n<li style=\"text-align: justify;\"><strong>I<\/strong>nterface segregation principle. Pr\u00e9f\u00e9rer plusieurs interfaces sp\u00e9cifiques pour chaque client plut\u00f4t qu&rsquo;une seule interface g\u00e9n\u00e9rale.<\/li>\n<li style=\"text-align: justify;\"><strong>D<\/strong>ependency inversion principle. Il faut d\u00e9pendre des abstractions, pas des impl\u00e9mentations.<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-661 aligncenter\" alt=\"sylabe.ico\" src=\"\/wp-content\/uploads\/sylabe\/2014\/07\/sylabe.ico1.png\" width=\"32\" height=\"32\" \/><\/p>\n<h2 style=\"text-align: justify;\">Le paradigme MVC<\/h2>\n<p style=\"text-align: justify;\">CF : <a title=\"Mod\u00e8le-vue-contr\u00f4leur\" href=\"http:\/\/fr.wikipedia.org\/wiki\/Mod%C3%A8le-vue-contr%C3%B4leur\" target=\"_blank\">http:\/\/fr.wikipedia.org\/wiki\/Mod%C3%A8le-vue-contr%C3%B4leur<\/a><\/p>\n<p style=\"text-align: justify;\">A faire&#8230;<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-661 aligncenter\" alt=\"sylabe.ico\" src=\"\/wp-content\/uploads\/sylabe\/2014\/07\/sylabe.ico1.png\" width=\"32\" height=\"32\" \/><\/p>\n<h2 style=\"text-align: justify;\">La mod\u00e9lisation UML<\/h2>\n<p style=\"text-align: justify;\">CF : <a title=\"http:\/\/fr.wikipedia.org\/wiki\/UML_%28informatique%29\" href=\"http:\/\/fr.wikipedia.org\/wiki\/UML_%28informatique%29\" target=\"_blank\">http:\/\/fr.wikipedia.org\/wiki\/UML_%28informatique%29<\/a> &#8211; <a title=\"http:\/\/fr.openclassrooms.com\/informatique\/cours\/debutez-l-analyse-logicielle-avec-uml\" href=\"http:\/\/fr.openclassrooms.com\/informatique\/cours\/debutez-l-analyse-logicielle-avec-uml\" target=\"_blank\">http:\/\/fr.openclassrooms.com\/informatique\/cours\/debutez-l-analyse-logicielle-avec-uml<\/a><\/p>\n<p style=\"text-align: justify;\">A titre personnel, je suis peu enclin \u00e0 r\u00e9aliser une analyse pr\u00e9alable. Si le but du programme est clair, alors sa programmation est claire aussi et transpire la logique du programme. Ici, dans le cadre de <em>nebule<\/em> et <em>sylabe<\/em>, dans un \u00e9tat exp\u00e9rimental, il est difficile de cr\u00e9er une analyse qui ne sera pas remise en question \u00e0 la moindre d\u00e9couverte lors de l&rsquo;\u00e9volution des projets&#8230;<\/p>\n<p style=\"text-align: justify;\">Mais une mod\u00e9lisation, attach\u00e9e \u00e0 une documentation, est s\u00fcrement quelque chose d&rsquo;appr\u00e9ciable pour comprendre \u00e0 posteriori le fonctionnement de l&rsquo;ensemble.<\/p>\n<p style=\"text-align: justify;\">A faire&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programmation &nbsp; Le passage en programmation PHP orient\u00e9e objet est toujours en cours. Je vais essayer ici de condenser les cours en r\u00e8gles simple, une sorte d&rsquo;aide m\u00e9moire. La programmation orient\u00e9e objet La convention de codage PEAR Les principes SOLID Le paradigme MVC La mod\u00e9lisation UML \/! &#8211; En cours de r\u00e9daction -\u00c2\u00a0 \/!<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":7,"comment_status":"open","ping_status":"open","template":"","meta":[],"_links":{"self":[{"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=\/wp\/v2\/pages\/682"}],"collection":[{"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=682"}],"version-history":[{"count":0,"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=\/wp\/v2\/pages\/682\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.sylabe.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}