mardi, avril 20 2004

Adaptation du pattern Singleton à plusieurs instances (PHP et AS2)

Le pattern Singleton est trés souvent une bonne alternative à l'utilisation de classes possédant uniquement des méthodes statiques. Il permet de n'instancier qu'une seule fois une classe, et d'accéder toujours à cette même instance au moyen d'une méthode statique. Une brillante explication a déjà été faite par petepx dans son ticket DESIGN PATTERNS #1.

Sur le même principe, lors de la création de mon moteur de blog, je voulais économiser le plus possible de requêtes SQL, et donc éviter d'instancier deux fois le même objet. Par exemple, pour un ticket, il peut appraître trois fois sur la page d'accueil, dans des templates (et donc des scripts PHP) différents :

  • Dans le menu "Dernières entrées"
  • Dans le menu "Derniers commentaires"
  • Dans le contenu principal
Il s'agissait donc d'étendre le pattern Singleton pour qu'il me retourne à chaque fois la même instance, remplie depuis la base de données, mais l'instance que je veux.

Comme tout enregistrement d'une base de données bien concue, chaque ticket possède évidemment un identifiant unique, qui va alors me servir à distinguer le ticket que je veux en transmettant cet identifiant à ma méthode statique. Cet identifiant va également servir d'indice pour une propriété de type tableau stockant toutes les instances déjà créées.

Voici comment cela se présente en PHP4, qui je vous le rappelle n'offre pas la possibilité de faire des propriétés statiques. Il faut donc contourner cette limitation par l'utilisation de variables globales :// Déclaration de la classe
class Ticket {
   // Identifiant du ticket
   var $_id;
   // Fonction constructeur
   // Accés "private"
   function Ticket($id = 0) {
      if ($id > 0) {
         $this->_id = (int)$id;
      }
   }
   // Methode getInstance
   // Retourne une référence vers l'instance
   // correspondant à l'identifiant
   function &getInstance($id) {
      // Si l'indice n'est pas numérique, ne retourne rien
      if (!is_numeric($id)) {
         return;
      }
      // Teste l'existance de la propriété "statique"
      if (!isset($GLOBALS["INSTANCES_TICKETS"])) {
         $GLOBALS["INSTANCES_TICKETS"] = Array();
      }
      // Teste si l'instance demandée est déjà créée
      // Si ce n'est pas le cas, la classe est instanciée
      if (!isset($GLOBALS["INSTANCES_TICKETS"][(int)$id])) {
         $GLOBALS["INSTANCES_TICKETS"][(int)$id] = new Ticket($id);
      }
      // Retourne l'instance
      return $GLOBALS["INSTANCES_TICKETS"][(int)$id]
   }
}
// Utilisation
$monTicket =& Ticket::getInstance(124);
Voici ce que cela donnerait en AS2 : class Ticket {
   // Identifiant du ticket
   private var _id:Number;
   // Tickets instanciés
   private static var _lstInstances:Array = new Array();
   // Fonction constructeur
   private function Ticket($id:Number) {
      if ($id != undefined) {
         this._id = Number($id);
      }
   }
   // Méthode statique getInstance
   public static function getInstance($id:Number):Ticket {
      if ($id == undefined) {
         return;
      }
      // Si l'instance demandée n'existe pas, on la crée
      if (_lstInstances[$id] == undefined) {
         _lstInstances[$id] = new Ticket($id);
      }
      // On retourne l'instance
      return _lstInstances[$id];
   }
}
// Utilisation
var monTicket = Ticket.getInstance(124);

Suite à cela, j'accède aux propriétés de mon ticket via des getters, qui vérifient auparavant si l'instance à bien été remplie depuis la base de données (ou depuis un XML, ou depuis un requete serveur dans le cas de Flash). Ainsi, au premier accés, les propriétés de l'objet sont renseignées, et les accés suivants se font toujours sur la même instance ! 8)

jeudi, avril 8 2004

Veille technologique PHP chez Globalis MS

La société GLOBALIS Media Systems, spécialisée dans la veille technologique, propose sur son site les cahiers blancs de plusieurs études menées autour de la technologie PHP. Les derniers en date proposent une analyse détaillée sur :
:arrow: la place de PHP(PDF) dans l'économie française
:arrow: les moteurs de template(PDF) (le sujet qui m'interessait en fait :P)
:arrow: des solutions de cache(PDF) pour code PHP (notamment, le pré-compilateur inclus dans le Zend Engine de PHP4, qui précompile les pages PHP).

Trés interessant tout ca ! 8)

lundi, avril 5 2004

Moteur de blog : la nouvelle version pour trés bientôt !

J'ai allègrement mis à profit cette semaine de grève pour avancer à grand pas vers la nouvelle version du moteur de ce blog. Je pensais le mettre en ligne pour la reprise, mais tout compte fait, certains points de détail doivent encore être réglés, et je préfère allonger ma période de test avant la mise en "production". Une fois opérationnelle, il me restera à documenter les différentes API et autres fonctionnalités du moteur, et à créer un template "de base", et un site pour pouvoir le distribuer en OpenSource.

Il va falloir aussi que je m'assure de la compatibilité ascendante avec le moteur actuel, afin que les favoris enregistrés soient toujours valides, ainsi que le fil RSS (une mise a jour de l'adresse du fill RSS sera conseillée, mais pas obligatoire pour l'instant).

Au menu des fonctionnalités et caractéristiques :
:arrow: Une API d'accés aux données, encapsulant toutes les requêtes SQL.
:arrow: Un moteur de templates à la Smarty, accés sur les fonctionnalités du blog.
:arrow: La possibilité de surveiller les commentaires d'un ticket en abonnant son adresse email.
:arrow: Des URL-rewriting optimisés pour le référencement, pour les hébergeurs offrant cette possibilité.

La version de ce moteur pour mon blog aura les spécificités suivantes :
:arrow: Le retour du formulaire Flash, fonctionnant sur Mac. :)
:arrow: Le titre du ticket sera celui de la page HTML (monsieurfil, si tu me lis ! :P), facilitant la mise en favori des tickets.
:arrow: La séparation du post et des commentaires : accélérant le chargement d'un ticket pour ceux qui ne veulent pas voir les commentaires, et optimisant par la même occasion le référencement ! ;)

Ce qui ne sera pas présent dans la première version, mais est prévu trés prochainement :
:arrow: La gestion des liens par l'API d'accés aux données.
:arrow: La gestion des archives (listes des différents mois).
:arrow: De nouvelles balises de templates, pour plus de souplesse dans l'affichage.

Le moteur de templates est la partie dont je suis le plus fier en fait. 8) Ce type de développement est vraiment passionnant, car on a vraiment l'impression de créer un nouveau langage ! :D Les templates sont basés sur un système de balises, et permettent d'intégrer directement au code HTML des conditions, des boucles, ou des pseudo-include ....Cela permet de modifier complètement la mise en page sans avoir une seule ligne de PHP mélée au code HTML. Les non-programmeurs pourront ainsi se créer un blog sur-mesure à partir du moment où ils savent faire du HTML (ou XHTML/CSS). Et la modification est d'autant plus facile, qu'on ne touche jamais au traitement lui-même, ce qui limite logiquement l'apparation de bugs lors d'une modification de la mise en page ! :)

mardi, mars 23 2004

Compilateur PHP : un outil pour Flash ?

Il y a longtemps, était sorti un pseudo-compilateur PHP, nommé PHPCompiler, qui a disparu pour des raisons que j'ignore. Ce manque est maintenant comblé avec PriadoBlender qui prend la relève. Il ne s'agit pas d'un vrai compilateur au sens strict, étant donné que ce logiciel se contente d'associer l'executable php.exe avec le script PHP que vous désirez "compiler", au sein d'un seul et même executable. :)

A partir de cela, il est facile d'imaginer des applications Flash au sein de projecteurs, qui pourraient lancer un serveur de sockets PHP avec un fscommand, et se connecter à ce même serveur local pour effectuer des actions qui lui sont impossible par lui-même. On pourrait ainsi imaginer des applications Flash offline qui peuvent se ballader sur un disque dur, y lire et y écrire des données, se connecter sur IRC ou a des comptes email, etc... 8)

En bref, ce type d'utilitaires permet de rapprocher le développeur Flash de la programmation Windows, en utilisant une technologie PHP, trés fréquemment utilisée comme un complément de Flash. Différents types d'API (accés au système de fichiers, etc..) peuvent même être créées pour ne même plus avoir à connaitre le PHP. Avis aux amateurs, personnellement, je vais m'y tenter ! ;)

vendredi, mars 19 2004

PHP5 : la release candidate 1 est la !

Enfin, voici la version RC1 de PHP : http://www.php.net/ ... Je l'attendais pour m'y mettre, téant donné que les versions beta n'avaient pas forcément toutes les fonctionnalités ... Maintenant, tout code fait avec cette version sera compatbile avec la version finale, les prochaines évolutions ne feront que corriger les bugs. Donc vous pouvez commencer à faire du PHP5 sereinement ! :D

lundi, mars 15 2004

Serveur de socket multiutilisateur en PHP

Actuellement en train d'étudier l'extension Socket de PHP, et plus largement les possibilités d'utilisation de PHP en ligne de commande (voire dans une GUI avec PHP-GTK) j'avais jusqu'à aujourd'hui la ferme intention de développer mon propre serveur de socket multi-utilisateur pour, entre autre, une utilisation conjointe à Flash. :)

Je dis bien jusqu'à ajourd'hui, car je suis tombé sur un serveur PHP nommé patServer. Il m'a suffit de regarder le code pour voir que c'est exactement ce que je voulais, et que coder le mien reviendrait à faire strictement la même chose. Donc, au lieu de réinventer la roue, je vais me contenter de dériver la seule et unique classe de ce serveur.

Simple mais trés bien pensé, il fournit un système de callback trés analogue aux évenements de Flash. Les évenements sont le strict nécessaire : démarrage, arret, nouvelle connexion, connexion refusée, nouvelle donnée, deconnexion. Avec un système de limitation du nombre de clients simultanés, et de configuration du caractère de fin d'un message (pratique pour le caractère 0 de Flash 8)).

Voici le code simplissime que j'ai utilisé pour créer un chat via telnet :/**
* MyServer.php
* classe serveur
*/

require_once "patServer.php";
class MyServer extends patServer {
        function onConnect ($i) {
                $this->broadcastData("Nouveau client", array($i));
        }
        function onReceiveData ($i, $data) {
                $this->broadcastData($data);
        }
}
/**
* launch.php
* Lancement du serveur
* Utilisation : taper 'php launch.php' en ligne de commande
*/

require_once "class/MyServer.php";
$srv = new MyServer();
$srv->start();

Et voila, je peux me connecter sur deux telnet différents et discuter avec moi-même !!! :P

mercredi, février 11 2004

DSPlay 0.3 : BBCoder, MailCrypter et Linker

J'ai continué à tripatouiller mes différents modules DSPlay. :=)

BBCoder est maintenant disponible, recommencé à partir de 0, plus performant du fait qu'il utilise moins d'expressions régulières (mais plus compliquées). Maintenant implémenté en POO, son utilisation en est d'autant plus simplifiée, et autorise du coup la sérialisation de l'objet pour ne pas reparser le XML à chaque utilisation. Par contre, je n'ai pas pris la peine d'assurer la compatibilité ascendante, étant donné le changement radical d'appel des procédures, faire quelques petits chagements aux fichiers XML n'est pas énorme en comparaison (les changements du schéma XML sont d'ailleurs assez minimes). :)

MailCrypter est le module d'encryption des mails. Plus évolué, il utilise maintenant des noms de variables javascript aléatoires, plus difficilement parsables. Evidemment, rien n'est impossible pour les créateurs d'aspirateurs d'adresse email, mais tant qu'à faire autant leur compliquer la tâche ! ;)

Linker a fait son apparition. Il se content de transformer les URLs et adresse emails en liens, avec un option pour qu'il utilise MailCrypter avec les emails ! 8)

Colori a également évolué un tout petit peu. En fait, il ne va lire les fichiers XML qu'au premier appel de la méthode de colorisation. Cela permet d'inclure les déclarations de classes de manière systématique dans toutes les pages d'un site, sans que du temps de calcul soit utilisé inutilement. Le BBCoder utilise le même principe. 8)

Rendez-vous sur http://www.lalex.com/dsplay/ pour télécharger la nouvelle version ! :D

lundi, février 2 2004

DSPlay : Colorisateur, BBCode and co

Je viens de finir un mini-site consacré au un ensemble de librairies PHP dont le colorisateur de code que je vous ai présenté dans le post précédent. Cette librairie nommée DSPlay ne contient pour l'instant que ce colorisateur nommé Colori mais elle contiendra prochainement des version "remasterisées" du crypteur de mail, du parseur de BBCodes et du parseur de smileys. Elle pourra ainsi être utilisée pour fournir facilement des fonctionnalités avançées à un blog, forum, ou tout autre outil destiné à présenter un contenu texte. 8)

J'ai également rédigé une licence sur la base de la licence OpenSource BSD, qui en fait vous donne le droit d'en faire a peu prés ce que vous voulez, à partir du moment où vous distribuez le code source en me citant dans la licence, et que vous mettez un lien vers le site de la librairie dans les sites qui l'utilisent ... Rien de bien restrictif donc, mais je pense que c'es la moindre des chose ... 8|

Pour télécharger et avoir plus d'infos, vous pouvez-donc vous rendre sur http://www.lalex.com/dsplay/ ^^

jeudi, janvier 29 2004

Colorisateur de code en PHP

Je continue de travailler sur mon parseur de documentation AS2, et j'ai fini par constater que ce type de recherche dans le code ressemblait diablement à ce qu'il faudrait faire pour créer un colorisateur de code.

Je me suis donc éloigné quelque peu de la documentation pour créer ce colorisateur en PHP, basé sur des fichiers de configuration XML. Ses principales features sont

  • Marche théoriquement pour tout langage (fichiers AS2 et PHP pour l'instant)
  • Permet une configuration pour une sortie conforme aux standards du W3C
  • Choix de la colorisation avec soit un couleur et/ou un style, soit une classe CSS
  • Séparation en deux fichiers XML des paramètres du langage (entrée) et des paramètres de mise en forme (sortie). Un même fichier de configuration de mise en forme (couleurs, classes, ...) peut servir pour plusieurs langages.
  • Catégories de mots-clés en nombre illimité, avec la possibilité d'appliquer une mise en forme à chacune d'elle
  • Gestion des blocs de documentation (séparateurs indépendants, comme /**)
  • Choix entre la conservation ou non de l'indentation pour un affichage en HTML

Vous pouvez pour l'instant le tester sur cette page. Si vous trouvez un disfonctionnement, n'hésitez pas à ma le signaler ! :D

Ce module sera prochainement disponible au téléchargement dés que j'aurais trouvé la manière de formuler la licence. En effet, je cherche à mettre sur mes codes une license qui permettrai à chacun de l'utiliser comme bon lui semble, mais sans oublier de citer l'auteur (moi en l'occurence :P) sur les sites qui utilisent ces outils. Bien sûr nombreux sont les utilisateurs qui se contrefoutent de la licence, mais les utilisateurs honnêtes pourront se ranger aux conditions de la licence. ;) Je remercie d'ailleurs à ce sujte zwetan qui m'aide à faire le bon choix sur la license à utiliser et les modifications à y apporter. 8)

page 2 de 2 -