Coolforest.net

Aller au contenu | Aller au menu | Aller à la recherche

PHP 5 / PHP 6

PHP5, l'orienté objet, PDO, et quelques frameworks

Fil des billets - Fil des commentaires

mardi, juillet 17 2007

PhpMyObject v. 0.06 (GPL)

Nicolas BOITEUX vient de publier un premier tutoriel sur http://pmo.developpez.com/, un Object-Relationnal Mapping tout récent, sous licence GPLv3 développé en PHP.

Le rôle de PMO est de permettre aux développeurs PHP de travailler mieux, plus rapidement en orienté objet. Chaque ligne provenant d'un résultat SQL est découpé en autant d'objets qu'il y a de tables dans la requête. Chaque valeur d'une colonne correspond à un attribut de l'objet, chaque nom de colonne correspond à un nom d'attribut. Ex pour une table utilisateur avec une colonne login, PMO va créer pour chaque ligne, un objet utilisateur avec un attribut login.

lundi, juillet 16 2007

"We remove the magic_quotes feature from PHP (~ 6)"

Magic_quotes disparait de PHP 6 .

La conclusion d'un article clair et synthétique de Damien sur PHP France proposait déjà de ne plus utiliser magic_quotes() :

Pour résumer, les magic quotes ont été créées pour les débutants, et font de PHP un des languages les moins sensibles à l'injection SQL. Néanmoins, une fois que vous comprenez bien leur fonctionnement, il est préférable de les désactiver et de protéger vos données vous même à l'aide des fonctions d'échappement de votre SGBD. C'est plus efficace et plus portable !

Dans un document au titre explicite ("Pourquoi ne pas utiliser les guillemets magiques?"), le site de PHP version FR redit la même chose, de manière plus ramassée :

Portabilité : Cette directive peut être activée ou désactivée suivant les serveurs et cela affecte grandement la portabilité. Utilisez get_magic_quotes_gpc() pour vérifier s'ils sont actifs ou pas, et adaptez votre application. Performances : Comme ce n'est pas toutes les données qui sont finalement placées dans une base, il y a un coût en vitesse pour protéger toutes ces données. Le simple appel des fonctions de protections en fonction des besoins est plus efficace (addslashes()). Même si php.ini-dist active ces options par défaut, php.ini-recommended les désactive. Cette recommendation est surtout faite pour des raisons de vitesse. Peu pratique : Comme toutes les données n'ont pas forcément besoin de protection, il est souvent désagréable de voir des données protégées là où ça ne sert à rien. Par exemple, lorsque vous envoyez par mail un formulaire, et que vous voyez des anti-slashs parsemer le message. Pour corriger cela, il faut faire un usage fréquent de stripslashes().

jeudi, novembre 9 2006

Convertir des fichiers au format OpenDocument en HTML / XHTML

Odt2Xhtml est une classe en PHP5, dont le but ultime est de convertir des fichiers au format OpenDocument - ODT - en fichiers (x)html pour faciliter la publication sur Internet de vos pages et/ou l'intégration dans des systèmes de publication Internet...

le projet / la classe PHP5 : http://odt2xhtml.eu.org/

Utilisation :

require_once('directory/odt2xhtml/odt2xhtml.php');
$file = 'name_file_without_extension';
$frontend = '/directory_where_odt_to_converse';
$root = $_SERVER[['DOCUMENT_ROOT']];
$class = new odt2xhtml($root,$frontend,$file);
$class->convert2xhtml();

vendredi, juin 30 2006

Try and Catch et gestion des exceptions

PHPJe note pour mémoire une citation tirée de "PHP 5 Power Programming" de Andi Gutmans, Stig Sæther Bakken et Derick Rethans :

When using exceptions, follow these basic rules (both for performance and code-manageability reasons):

- Remember that exceptions are exceptions. You should only use them to handle problems, which brings us to the next rule….

- Never use exceptions for flow control. This makes the code hard to follow (similar to the goto statement found in some languages) and is slow.

- The exception should only contain the error information and shouldn't contain parameters (or additional information) that affect flow control and logic inside the catch handler.

Ca s'applique finallement aussi bien à PHP5 qu'à .NET ou Java.

J'ajoute 2-3 liens :

Le livre "PHP 5 Power Programming" a été publié en Open Publication License, v1.0

samedi, avril 15 2006

Zend Framework, avec et sans MVC

Petite revue de trois tutoriels récents :


Zend

Ces tutoriels exigent d'installer le Zend framework (2,75 Mo, le répertoire /library suffit).

AVEC

Le premier tutoriel, de Chris Shiflett, tient en 6 pages dans un anglais facile à lire. Il permet de découvrir le nouveau framework de Zend, et de se familiariser par la pratique au modèle MVC. Chris Shiflett est lui-même un contributeur du projet Zend Framework. Pour réaliser ce tutoriel de bout en bout, on pourra installer par exemple Xampp sous Linux ou WampServer sous Windows, de manière à bénéficier de PHP 5. Attention, pour permettre la ré-écriture d'URL, il faudra décommenter la ligne (retirer le #)

LoadModule rewrite_module modules/mod_rewrite.so

dans la partie Dynamic Shared Object (DSO) Support du fichier de configuration d'Apache (httpd.conf, accessible par click droit sur l'icone de WampServer > Config Files > httpd.conf). Le premier tuto commence par de la ré-écriture d'URL, au format http://mon-site.com/Controller/action/param/value. Ce tuto permet de faire une petite application interfaçant une base de donnée. Une fois incluse la bibliothèque de classes (/library), les premières page proposées consistent en fait à mettre en oeuvre le modèle MVC qui structure une partie du framework Zend. Du coup, il peut être utile de relire une description du modèle MVC parmis les Design Pattern, par exemple chez phpwact.org, chez phppatterns.com, chez PHP Wiki ou encore dans la présentation générale du principe des DP par Zend.

Cependant, on notera que l'usage de ce modèle MVC n'est pas absolument obligatoire dans le Zend framework, et que l'on peut éventuellement s'en passer. C'est ce que montrent les deux autres tutoriels.

SANS ?

L'intérêt de ces deux tutos est de montrer que l'on peut utiliser le Zend framework sans s'imposer d'utiliser toute la logique du modèle MVC. Cela veut dire aussi que l'on peut utiliser le Zend framework dans une application déjà construite, sans avoir à la modifier totalement.
Alors du coup, votre le framework Zend, vous le prendrez avec ou sans MVC ??... De fait, les propos sur la place du modèle MVC dans le framework provoquent des réflexions différentes : Chez Zend, Andi Gutmans explique :

We are currently working on some of the key MVC glue which would really define the framework for what it is.

D'un autre côté, Rasmus Lerdorf écrit un anti-framework, et s'exprime avec des propos un peu en demi-teinte par rapport au modèle MVC, ou plus exactement par rapport à la lourdeur un peu inhérente des frameworks basés sur le modèle MVC :

I don't have much of a problem with MVC itself. It's the framework baggage that usually comes along with it that I avoid. Parts of frameworks can be useful as long as you can separate the parts out that you need. As for MVC, if you use it carefully, it can be useful in a web application. Just make sure you avoid the temptation of creating a single monolithic controller.

On trouvera chez Laurent Jouanneau un débat (+ Goggle cache) autour du Zend Framework et de ses conséquences dans le monde fourmillant des frameworks PHP basés sur MVC, et plus généralement sur l'utilité de pouvoir n'importer d'un framework que ce que l'on en utilise vraiment, notamment grâce à l'implémentation d'autoload().

mardi, mars 21 2006

Force IE Refresh

La solution HTML ne fonctionne pas sous IE :

<meta http-equiv="Cache-Control" 
      content="no-cache, must-revalidate" />
<meta http-equiv="Pragma" 
      content="no-cache" />
<meta http-equiv="Expires" 
      content="Fri, Jan 01 1900 00:00:00 GMT" />
 

La solution PHP force IE à prendre en compte la dernière version de la page. Elle évite de devoir rafraîchir sans cesse le cache.

// Resolve IE bug ; more efficient than metas
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Fri, Jan 01 1900 00:00:00 GMT"); // Past date

Ouf !

mardi, février 21 2006

So long, .php3

irc://freenode/spip, 2006-02-21 14:12:00 :

_fil_ has changed the topic to “SPIP 1.9 -
les fichiers .php3 vivent leurs derniers instants”

:-D

mardi, décembre 27 2005

Modèle de classe en PHP 5

Voir le source du modèle de classe PHP 5, sous licence CC by-sa.

Ce modèle est à compléter par une petite librairie de fonctions usuelles (la création de la connexion à la base de donnée via PDO, SecureIt(), ...)

Inspiration

Les sources d'inspiration de ce modèle de classe sont :

Moins rigoureux mais plus léger qu'un MVC complet

Je cherchais initialement un framework basé sur le Design Pattern MVC, mais j'ai fini par renoncer à php.MVC et aux autres frameworks php dédiés à MVC car le modèle MVC me semblait trop lourd à metrre en place et avec un temps d'apprentissage un peu long pour des projets plutôt modestes (moins de 15 jours de développement). Je cherchais néanmoins à rester dans une logique de couplage faible entre les objets métier et la base de donnée, et dans l'optique d'utiliser des design patterns, notamment le Singleton.

Pour l'accès aux données, je me suis alors tourné vers PDO plutôt que PEAR, à cause de la relative lenteur de ce dernier. PDO est une interface commune d'accès aux bases de données plutôt qu'une une véritable couche d'abstraction pour l'accès aux bases de données ; elle est livrée en standard depuis PHP 5.1 (PDO, c'est aussi un peu le buzz du moment). Cela permet de limiter le modèle n-tiers MVC à deux couches au lieu de trois : Le View et le Controler ; tandis que la couche Model et son accès à la bdd est entièrement gérée par PDO. On garde donc bien une sépartion entre les traitements métiers et la couche de présentation, mais sans s'encombrer d'une couche d'abstraction de la bdd.

Trop de n-tiers tue le n-tiers ;-)

(Un peu facile, ce titre...) De fait, implémenter l'accès aux donnée dès le constructeur d'un objet métier peut laisser songeur, surtout si l'on est un fervent défenseur des modèles n-tiers strictement respectés. Mais la démarche du modèle présenté ici se veut pragmatique. D'expérience, développer des modèles n-tiers avec des couches rigoureusement séparées apparaît un peu factice dans des projets qui restent simples, qui ne manipulent que des données hexadécimales (et non des objets cartographiques, par exemple). Utiliser l'Orienté Objet et le design Pattern MVC pour interfacer des bases de données communes ne devrait pas systématiquement conduire à une inflation du nombre de lignes de code[1], or c'est souvent le cas. Contruire une couche entière d'abstraction stricte de la base de donnée (entre l'objet et le SGBD), est un processus très "esthétique" sur le papier, mais qui oblige à multiplier les fichiers et les classes, et ne se justifie que pour des projets ambitieux et exposés à de fortes évolutions. Ici, l'utilisation de PDO comme interface commune à plusieurs SGBD permet de maintenir un couplage faible entre l'objet et la base de donnée elle-même. Il est donc possible, avec un tel modèle, de prévoir des migrations de base de donnée (cf. la liste des bdd supportées par PDO). On devra cependant veiller à utiliser des requêtes SQL les plus standard possibles. Si donc l'appel au SGBD se fait dès la couche métier, il se veut limité et maîtrisé : Il ne se fait en fait qu'à trois endroits : dans le constructeur même de l'objet et dans deux les méthodes d'enregistrement (Record()) et de suppression (Drop()) de l'objet.

Constructeur quadrimorphe

Le constructeur de ce modèle permet de gérer rapidement les CRUD ("CREATE, READ, UPDATE, DELETE"), ces 4 cas les plus courants lorsque l'on construit une application interfaçant une base de donnée. Dans ce constructeur, on prend en compte une propriété particulière de l'objet : son identifiant unique tel qu'il existe dans la base de donnée : $id. Les autres données, qu'elles soient connues ou non, sont stockées sous forme de tableau : $tab. L'usage d'un identifiant unique, le fait qu'on le connaisse déjà ou pas, correspond rapidement à ces 4 cas de CRUD :

  • Cas 1 : On ne connaît ni l'identifiant ni les autres propriétés de l'objet.
    Ce cas correspond à la création d'un objet vide, lorsque l'on ne connaît aucune de ses propriétés.
  • Cas 2 : On ne connaît pas l'identifiant de l'objet mais on connaît toutes ses autres propriétés stockées dans $tab. Ce cas correspond à la création de l'objet à partir d'informations non encore enregistrées dans la base de données. Typiquement, des informations soumises par un utilisateur via un formulaire.
  • Cas 3 : On ne connaît que l'identifiant de l'objet $id, mais aucune autre propriété de l'objet. Typiquement, ce cas correspond à la recherche ou à la suppression des propriétés d'un objet dans une base de données, à partir de son identifiant $id.
  • Cas 4 : On connaît tout l'objet, constitué de son identifiant $id et de toutes ses autres propriétés stockées dans $tab. Typiquement, ce cas correspond à la mise à jour des propriétés d'un objet stockées en base de donnée.

Cela donne :

private function __construct($id,$tab) {       
     // CASE 1 : No $id and no $tab => CREATE - step 1/2
     global $bdd;
     if (!$id AND sizeOf($tab)==0) {
         $this->member_id      = "";
         $this->member_name    = "";
         // etc.
     }
 
     // CASE 2 : No $id but existing $tab => CREATE - step 2/2
     if (!$id AND sizeOf($tab)!=0) {
         $this->member_id      = (int)secureIt($tab[['member_id']]);
         $this->member_name    = (string)secureIt($tab[['member_name']]);
         // etc.
     }
 
     // CASE 3 : Existing $id but no $tab => READ
     if ($id AND sizeOf($tab)==0) {             
         $sql = "SELECT * from member WHERE member_id = " . $id;
         $result = $bdd->query($sql, PDO::FETCH_OBJ);
         $line = $result->fetch();
         $this->member_id      = (int)$line->member_id;
         $this->member_name    = (string)$line->member_name;
         // etc.
     }
 
     // CASE 4 : Existing $id and existing $tab => UPDATE
     if ($id AND sizeOf($tab)!=0) {
         $this->member_id      = (int)$id;
         $this->member_name    = (string)secureIt($tab[['member_name']]);
         // etc.
     }
 }

L'intérêt de ce constructeur à 4 formes est qu'il correspond bien aux 4 cas les plus fréquents dans la manipulation d'un objet issu d'une base de données. Il permet d'effectuer rapidement des opérations basiques sur ce type d'objet : La création, la lecture, la mise à jour et la suppression d'un objet peuvent se faire dès son instanciation ou presque.

Record() pour l'insertion/modificatilon, Drop() pour la suppression

Deux méthodes complètent la classe : Record() et Drop().
Record() permet d'insérer un objet ou de le mettre à jour, selon que l'on connaît déjà ou pas son identifiant dans la base de données. Drop() permet de supprimer l'objet dès que l'on connaît son identifiant.

Conclusion

J'ignore si ce modèle de constructeur quadrimorphe existe déjà quelque part et s'il est (? peut-être) déjà référencé comme un design pattern. Quoi qu'il en soit, je ne le présente pas comme tel. Il n'est pas de moi, mais m'a été transmis (cf. mes sources). Je l'ai développé en-dehors de mes heures de boulot, c'est pourquoi je prends la liberté de le présente ici et de lui donner une licence. Le modèle de classe proposé ici n'est qu'une première version, perfectible, qui croise des bonnes pratiques distribuées par d'autres avant moi. Je ne fais que les réunir en un seul modèle. N'hésitez pas à réagir pour l'améliorer.

Notes

[1] Tout ce code, qu'il soit écrit ou généré, sera toujours à maintenir et à documenter.

lundi, décembre 26 2005

Php.mvc, la tête la première

Few notes about a famous PHP Design Pattern :

En français :

Voir aussi : Le Zend Framework, avec et sans MVC.

Le schéma de phppatterns.com :

mercredi, novembre 16 2005

Générer du code PHP 5 avec Rational Rose et UML

RosePHPTool est un module libre (GPL) pour Rational Rose.

Lire la suite...

lundi, octobre 31 2005

Optimiser PHP - dans le code

Dew's propose un benchmark bien documenté pour optimiser l'écriture de scripts php, avec quelques conclusions intéressantes :

La suite sur le blog de Dew

Voir aussi

mardi, juillet 5 2005

IDE PHP

Du nouveau dans le monde des éditeurs de code.

Lire la suite...

mardi, avril 26 2005

phpMyEdit

How many times have you hand coded a MySQL table editor in PHP? phpMyEdit application provides an instant table editor.

Lire la suite...

mardi, mars 15 2005

PHP 4, PHP 5...

Actualités et infos diverses

Lire la suite...

dimanche, mars 6 2005

Be Lazy!

"Les plus grandes inefficacités viennent de la résolution de problèmes que vous n'aurez jamais."

Lire la suite...

samedi, février 12 2005

XHTML2PDF

Xhtml2pdf est une classe PHP, libre et gratuite (sous license GPL) permettant de transformer des documents xhtml en PDF. Xhtml2pdf est basée sur l'excellente classe d'Olivier PLATHEY, FPDF.

Le site du projet : Xhtml2Pdf

lundi, décembre 27 2004

Id unique

Un bout de code pour créer un id "unique" en PHP :

 md5(uniqid(rand()));

ce qui donne un id de type : "8fa139f3159e87a63f7e41b7b18e85d5"

mercredi, décembre 22 2004

Certification PHP par ZEND

200.00 $ et quelques critiques assassines.

Lire la suite...

dimanche, décembre 19 2004

Chargement la volée des définitions de classes

A l'instanciation de chaque objet, une "magic function" de PHP 5 permet de charger automatiquement la bonne définition dans la librairie des classes.

Lire la suite...

jeudi, octobre 28 2004

UML2PHP5

Comment générer automatiquement le squelette d'un script PHP 5 depuis un schéma UML

Lire la suite...

- page 1 de 2