Avec le projet Phalanger, PHP devient un langage de premier choix sur la plate-forme Microsoft  .NET

Phalanger est le nom de code d'un projet Open Source visant à créer une nouvelle implémentation du langage PHP sur la plate-forme .NET de Microsoft, permettant d'ajouter PHP à la liste déjà longue des langages supportés sur .NET, et permettant ainsi d'exécuter sans modification des applications PHP existantes en environnement .NET. Par exemple, à ce jour, des applications telles que phpBB, phpMyAdmin ou encore Wordpress fonctionnent sur Phalanger sans aucune modification dans leur code source.

Sommaire

IntroductionIntroduction

  • Origine et historique du projetOrigine et historique du projet

  • Versions actuellesVersions actuelles

Configuration nécessaireConfiguration nécessaire

InstallationInstallation

Configuration et paramétrage : mais qu’ont-ils fait de mon PHP.INI ?Configuration et paramétrage : mais qu’ont-ils fait de mon PHP.INI ?

Que propose Phalanger ?Que propose Phalanger ?

Exécution d’applications PHP existantes, mode de compilation « legacy »Exécution d’applications PHP existantes, mode de compilation « legacy »

Bibliothèque d’extensions PHP4Bibliothèque d’extensions PHP4

Ecriture d’applications .NET avec le langage PHPEcriture d’applications .NET avec le langage PHP

  • Rappel rapide sur .NET et ASP.NET 2.0Rappel rapide sur .NET et ASP.NET 2.0

  • Applications Web de type ASP.NET 2.0 avec PhalangerApplications Web de type ASP.NET 2.0 avec Phalanger

  • Applications client riche « Windows Forms »Applications client riche « Windows Forms »

  • Support de Visual Studio 2005Support de Visual Studio 2005

Interopérabilité entre les codes PHP et .NETUtilisation de classes .NET depuis PHPUtilisation de classes PHP depuis .NETInteropérabilité entre les codes PHP et .NETUtilisation de classes .NET depuis PHPUtilisation de classes PHP depuis .NET

Microsoft Ajax et Phalanger : le Personal WebSite Starter KitMicrosoft Ajax et Phalanger : le Personal WebSite Starter Kit

Utilisation de Microsoft Ajax avec Phalanger : Le composant UpdatePanelUtilisation de Microsoft Ajax avec Phalanger : Le composant UpdatePanel

  • Les contrôles du Microsoft Ajax Control ToolkitLes contrôles du Microsoft Ajax Control Toolkit

Conclusion partielleConclusion partielle

Liens utiles et téléchargementsLiens utiles et téléchargements

 

Introduction

Origine et historique du projet

Initialement, le projet a démarré au début de l’année 2003 dans l’Université de Mathématiques et de Physique de Prague en République Tchèque. L’objectif de départ des six étudiants à la génèse du projet était d’étudier la faisabilité et les apports de l’environnement .NET pour les langages dynamiques, en particulier pour PHP. Le premier projet portait simplement le nom de PHP.NET.

Une première version v 1.0 de Phalanger a été publiée en Février 2006. Elle proposait principalement un compilateur PHP pour .NET ainsi qu’un environnement d’exécution compatible avec PHP4 et PHP5.

Versions actuelles

La version v 2.0 de Phalanger est actuellement en phase de Bêta : la dernière version Bêta publiée est la Bêta 3. La version Bêta 3 apporte entre autres le support et l’intégration de l’environnement Phalanger à la famille d’outils de développement Visual Studio 2005 de Microsoft, ainsi qu’un exemple d’application ASP.NET 2.0 écrite en PHP que nous étudierons un peu plus tard : le Personal Web Site Starter Kit.

Dans cet article, nous utiliserons également la version précédente, à savoir la Bêta 2 car celle-ci propose le support de MySQL alors que cette extension n’a bizarrement pas été recompilée pour la version Bêta 3. Ceci dit, puisque tous les codes sources sont fournis, vous pouvez parfaitement recompiler l’extension MySQL pour Phalanger Bêta 3 par vous même…

Les codes sources du projet sont hébergés depuis la version Bêta 2 sur le site CodePlex de Microsoft, qui est en quelque sorte l’espace collaboratif proposé par Microsoft pour les projets Open Source sur ses technologies. Dit autrement, CodePlex est un peu le SourceForge du monde Microsoft.
L’ensemble du projet Phalanger est fourni sous une licence de type Open Source nommée « Microsoft Permissive Licence » (on lit parfois Ms-PL) et qui est très comparable à la licence BSD.

Il y a une exception à ceci : l’extension MySQL pour Phalanger est quant à elle fournie sous licence GNU GPL, car étant dérivée du code du projet MySQL Connector/.NET fourni initialement par MySQL sous licence GNU GPL.

Sur Internet

L’adresse de base du site hébergeant le projet Phalanger : http://php-compiler.net/
Pour télécharger les codes sources ou les versions installables : https://www.codeplex.com/Phalanger

Télécharger les binaires ou les codes sources de l’extension MySQL pour Phalanger : https://www.codeplex.com/PhalangerMySQL

Configuration nécessaire

S’agissant d’un compilateur et d’un environnement d’exécution PHP pour la plate-forme .NET, pour pouvoir vous livrer à quelques tests et expérimentations sur Phalanger, il vous faut une configuration supportant le Microsoft .NET Framework 2.0. En clair, vous aurez besoin d’un ordinateur fonctionnant sous Windows 2000, Windows XP, Windows Server 2003 et Windows Vista.
D’autre part, pour permettre l’exécution des applications Web avec ASP.NET, vous devrez installer ou activer le serveur HTTP de Windows sur votre machine. Pour activer Internet Information Server (IIS), allez dans le Panneau de Configuration / Ajout ou Suppression de Programmes puis Ajouter/Supprimer des composants Windows puis rechercher  « Internet Information Server » et cocher les options correspondantes.
Il est conseillé d’activer IIS avant d’installer le .NET Framework 2.0 faute de quoi les associations logiques entre IIS et .NET permettant l’exécution des applications ASP.NET ne pourra pas se faire automatiquement à l’installation et vous devrez effectuer ces associations manuellement en ligne de commande.

Installation

L’espace de téléchargement du projet Phalanger sur CodePlex propose le téléchargement d’une archive au format Zip de 11,5 Mo comportant de quoi installer Phalanger 2.0 Bêta 3 sur votre machine. L’espace de téléchargement est accessible depuis l’onglet « releases » de l’espace CodePlex du projet Phalanger. Après l’avoir téléchargé, ouvrez le fichier Zip et lancez l’installation via le programme « setup.exe », puis laissez-vous guider par l’assistant.

Fig. 1 : Cochez la case lors de l’installation de Phalanger si vous souhaitez configurer automatiquement les applications d’exemple
Cochez la case « Create virtual web directories with sample web applications » pour que l’assistant installe et configure les exemples d’applications Web, comme indiqué sur la Figure 1.

Configuration et paramétrage : mais qu’ont-ils fait de mon PHP.INI ?

Vous êtes habitués à configurer PHP pour vos applications Web via le fichier de configuration PHP.INI. Avec Phalanger, ce fichier PHP.INI ne vous sera d’aucune aide. Phalanger reprend le principe de fonctionnement classique d’ASP.NET à ce niveau, ce qui signifie que le configuration d’une application Web pour Phalanger passe par le fichier de configuration nommé web.config. Il s’agit d’un fichier XML, mais suffisamment claire et lisible pour être édité avec un simple éditeur de texte tel que Notepad.

Le fichier Web.config pour Phalanger reprend l’intégralité des directives de configuration classiques du PHP.INI, en plus de quelques unes spécifiques à ASP.NET ou à Phalanger. Vous ne devriez avoir aucune difficulté à retrouver rapidement vos repères.
A titre d’illustration, le Listing 1 représente quelques portions de ce fichier web.config présentant des directives que tout développeur PHP a déjà manipulé au moins une fois dans sa vie dans le fichier PHP.INI 

Listing 1 :
<set name="RegisteringOrder" value="EGPCS" phpName="variables_order"/>
<set name="QuoteGpcVariables" value="false" phpName="magic_quotes_gpc"/>
<set name="QuoteRuntimeVariables" value="false" phpName="magic_quotes_runtime"/>
( ... )
<set name="ReportErrors" phpName="error_reporting">
       <add value="Error"/>
       <add value="Warning"/>
       <add value="Notice"/>
       <add value="Strict"/>
       <add value="UserError"/>
       <add value="UserWarning"/>
       <add value="UserNotice"/>
       <add value="ParseError"/>
       <add value="CompileError"/>
       <add value="CompileWarning"/>
</set>

En outre, c’est également au niveau de ce fichier web.config que vous devez déclarer lesquelles des Extensions PHP vous souhaitez activer pour une application donnée. Cette section se trouve en début du fichier web.config. Par exemple, les directives qui permettent d’activer les extensions MySQL et zLib, tout en laissant l’extension Calendar inactive (en commentaire) sont représentées dans le Listing 2.

Listing 2 :
<add assembly="PhpNetMySql, Version=2.0.0.0, Culture=neutral, PublicKeyToken=2771987119c16a03" section="mysql"/>
<add assembly="php_zlib.mng, Version=2.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3" section="zlib" />
<!--add assembly="php_calendar.mng, Version=2.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3" section="calendar" /-->

Enfin, il est intéressant de noter que le fichier web.config ne définit pas une configuration « globale » au niveau de votre serveur, mais que vous pouvez parfaitement déposer un fichier web.config différent par répertoire ou sous-répertoire d’application, pour disposer de comportements différents de Phalanger d’une application à l’autre, un peu à la façon du fichier .htaccess de Apache.

Que propose Phalanger ?

Phalanger propose deux modes de compilation différents pour les applications. Le premier, qui était le seul mode disponible dans Phalanger 1.0, vise à pouvoir exécuter des codes d’applications existantes sans modification de leur code source, en maximisant la compatibilité avec l’interprêteur PHP officiel. Ce mode est nommé « Legacy Mode ».

Le second mode permet d’utiliser le langage PHP pour développer à peu près n’importe quel type d’application sur la plate-forme .NET, le plus notable étant l’utilisation du langage PHP pour développer des applications Web selon le modèle ASP.NET 2.0. Ce mode de compilation est nommé le « Pure Mode ». Il permet également d’utiliser le langage PHP pour des applications Windows client riche de type Windows Forms ou encore de mettre en œuvre de l’intéropérabilité dans les deux sens entre des codes .NET et PHP, via les mécanismes objet de type héritage, spécialisation ou composition.

Exécution d’applications PHP existantes, mode de compilation « legacy »

Le mode de compilation « legacy » est le mode par défaut de Phalanger. C’est grâce à ce mode que des applications complètes telles que phpMyAdmin, phpBB ou encore Wordpress peuvent fonctionner dans l’environnement Phalanger sans aucune modification au niveau de leur code source, moyennant éventuellement quelques ajustements dans la configuration de Phalanger via l’édition du fichier de configuration web.config.

Du point de vue du fonctionnement du code, en mode « legacy », les applications peuvent utiliser les directives PHP standard require et include qui permettent d’inclure dynamiquement des portions de code sous la forme de fichiers externes inclus. Ce mode est le mode de compilation par défaut. Il est compatible en termes de modèle d’exécution à celui de l’interprêteur de script PHP officiel.

Dans le second mode, il s’agit d’un mode purement « .NET » dans lequel tout le code de l’application doit être connu au moment de la compilation et donne naissance à un assemblage contenant toute l’application sous la forme de code Microsoft Intermediate Language.  Dans ce mode, le recours aux directives PHP require et include est proscrit. On peut néanmoins les remplacer par des références aux codes externes, mais on perd l’aspect dynamique.

Du point de vue du compilateur Phalanger, il s’agit juste de passer une option en ligne de commande pour activer l’un ou l’autre des modes de compilation.
Considérons le code suivant :

<?php
echo "Hello from Phalanger";
?>

Ce code, parfaitement légal en PHP4 ou PHP5, peut être compilé en mode « legacy » avec Phalanger via la ligne de commande suivante, notez l’option « /pure- » qui désactive le mode Pure et active donc le mode Legacy  :

phpc.exe test.php /target:exe /pure- /verbose- /out:test.exe

Sans surprise, à l’exécution, on obtient bien l’affichage du message comme attendu.

En revanche, si on tente de compiler le même code en mode « Pure » via la ligne de commande suivante, on obtient une erreur du compilateur. Vous pouvez observer le message produit par le compilateur dans le Listing 3.

Listing 3 :
C:\Documents and Settings\clauer\My Documents>phpc test.php /target:exe /
pure+ /verbose- /out:test.exe
Phalanger - the PHP Language Compiler - version 2.0
for Microsoft (R) .NET Framework version 2.0
Performing compilation ...
C:\Documents and Settings\clauer\My Documents\test.php(3,1): error PHP105
2: Global code is not allowed in the pure unit.
error PHP1075: Missing entry point; no static parameterless method or function '
Main' found

Build complete -- 2 errors, 0 warnings.
C:\Documents and Settings\clauer\My Documents>

En effet, en mode de compilation “Pure”, et comme pour tout code .NET, une application est représentée par une classe, dont une des méthodes représente le point d’entrée qui détermine quelle partie du code effectuera le lancement de l’application.

Le code équivalent à notre application minimale en mode de compilation Pure s’écrirait alors tel que représenté dans le Listing 4.

Listing 4 :
<?php
class Program
{
       static function Main()
       {
             echo "Hello from Phalanger in Pure mode!\n";
             fgets(STDIN);
             return 0;
       }
}

Bibliothèque d’extensions PHP4

Nous venons de voir de façon un peu détaillée comment le mode Legacy permet d’exécuter des codes PHP existants avec une mode d’exécution comparable à celui de l’interpréteur PHP officiel. C’est bien, mais dans la plupart des cas, ça n’est pas suffisant pour pouvoir exécuter des applications complètes. En effet, bon nombre d’applications tirent parti d’extensions PHP qui ne font pas partie du langage PHP de base. Il était donc nécessaire de disposer dans Phalanger d’un moyen d’utiliser ces extensions. L’équipe de Phalanger fournit donc à cet effet un ensemble de wrappers en code .NET – on parle de « code managé » - pour chacune de ces extensions. Après installation, vous pourrez retrouver ces wrappers déployés dans le GAC (alias le Global Assembly Cache) qui se trouve dans le répertoire %Windir%\Assembly.

Ainsi, vous pouvez utiliser n’importe laquelle des fonctions contenues dans les extensions PHP4 parmi lesquelles figurent les suivantes, citées à titre d’illustration : bcmath, bz2, calendar, curl, domxml, exif, gd2, imap, sockets, zip ou encore zlib. Cette liste étant incomplète.

A titre d’illustration, vous pourrez trouver dans le Listing 5 le code d’une application minimale en mode Console qui accède aux tags EXIF d’une photo numérique, et dont un extrait du résultat d’exécution est présenté dans le Listing 6.

Listing 5 :
<?php
class Program
{
       static function Main()
       {
             echo "Utilisation de l'extension PHP EXIF\n";
             $exif = exif_read_data('C:\Documents and Settings\clauer\My Documents\My Pictures\MyPicture1.jpg', 0, true);
             echo "MyPicture1.jpg:\n";
             foreach ($exif as $key => $section) {
                    foreach ($section as $name => $val) {
                           echo "$key.$name: $val \n";
   }
}
             fgets(STDIN);
             return 0;
       }
}
?>

Listing 6 :
Utilisation de l'extension PHP EXIF
MyPicture1.jpg:
FILE.FileName: MyPicture1.jpg
FILE.FileDateTime: 1087837036
FILE.FileSize: 774331
FILE.FileType: 2
FILE.MimeType: image/jpeg
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP, MAKERNOTE
COMPUTED.html: width="1600" height="1200"
IFD0.Make: Canon
IFD0.Model: Canon DIGITAL IXUS 330
...

Pour activer ou désactiver une extension PHP pour une application donnée, vous devrez modifier le fichier web.config correspondant comme nous l’avons vu plus haut dans l’article au sujet de la configuration de Phalanger.

Ecriture d’applications .NET avec le langage PHP

Nous allons maintenant nous intéresser aux différents types d’applications .NET que Phalanger nous permet d’écrire en langage PHP, ainsi que quelques subtilités au niveau de l’intéropérabilité rendue possible entre des codes PHP et .NET au sein d’une meme application. Pour cela, commençons par rapidement présenter les concepts de base d’ASP.NET, qui seront nécessaires pour la compréhension de la suite.

Rappel rapide sur .NET et ASP.NET 2.0

Avant de présenter ce qui dans ASP.NET 2.0 peut etre fait avec Phalanger, il est sans doute nécessaire de faire un petit rappel de ce dont il s’agit et de ses principes de fonctionnement dans les grandes lignes.

ASP.NET 2.0 est le modele de développement d’applications Web qui arrive avec le Microsoft .NET Framework 2.0 et qui apporte un certain nombre d’évolutions par rapport a ses prédécesseurs  ASP.NET 1.x.

Avec ASP.NET, le développeur réalise les pages de son application ou de son site Web en manipulant des composants visuels ou non visuels dans sa page, en utilisant un modele de développement dit « évenementiel » tel ceux que les développeurs ont l’habitude d’utiliser pour le développement d’applications client riche dans les environnements tels que Visual Basic ou Delphi de Borland.

Ce modele de développement s’appelle « Web Forms », qu’on peut traduire par Formulaires Web. La différence fondamentale entre PHP et le modele Web Forms d’ASP.NET pour le développement d’applications Web, c’est que dans le premier cas, il est du ressort du développeur d’écrire le code qui sera responsable de la génération du HTML qui sera envoyé au navigateur. Il écrit alors du code qui, par exemple pour afficher du texte dans un élément DIV pourrait ressembler a ceci :

$libelle = "Ceci est le texte de l'element DIV";
echo "<div id=\"label1\"> $libelle </div>"

Avec ASP.NET et le modele Web Forms, le développeur manipule les objets qu’il a définis comme composant sa page en accédant a leurs propriétés ou en invoquant leurs méthodes, et c’est chacun des composants qui est responsable de la génération du code HTML qui le représente. Ainsi, l’exemple précédent en ASP.NET avec le langage C# s’écrirait de la façon suivante : le code de la page Web contiendrait la déclaration d’un composant standard Label nommé Label1 :  

<div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>

D’autre part, le code associé a l’évenement Page_Load qui s’exécute automatiquement au chargement de la page – c'est-a-dire lors de sa création a chaque requete – contiendrait une affectation a la propriété Text du Label, conformément au code suivant :

protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = "Ceci est le texte de mon label";
    }

Un des avantages de ce modele c’est que le développeur n’a pas a se soucier d’adapter la génération du code HTML au type de navigateur Web qui a effectué la requete. Ceci est de la responsabilité du composant Label. Si un composant doit générer un code HTML différent pour prendre en compte certaines différences entre Internet Explorer, Firefox ou Opera, c’est le développeur du composant qui écrira le code correspondant dans le composant. Le développeur qui utilisera ensuite ce contrôle n’aura pas a se soucier des différences entre les différents navigateurs, parce que ce comportement aura été capitalisé au niveau du contrôle Label.

Voila pour une explication tres rapide, et totalement incomplete des principes de base d’ASP.NET et du modele Web Forms. Vous comprendrez qu’il faudrait une série de plusieurs articles pour faire un tour d’horizon assez complet de ces sujets, et ce n’est pas le propos de cet article !

Toutefois, si vous souhaitez en savoir plus sur ASP.NET, sachez que vous pouvez trouver plusieurs articles d’introduction, des tutoriels et des vidéos sur les site de Microsoft France, ces contenus vous permettront de vous faire facilement et rapidement votre propre idée sur ces technologies. Vous retrouverez tous les liens utiles en fin d’article.

Applications Web de type ASP.NET 2.0 avec Phalanger

Avec la version 2.0 de Phalanger, il est maintenant possible d’utiliser le langage PHP pour écrire des applications Web en ASP.NET 2.0, au meme titre que les autres langages .NET, comme par exemple C# ou VB.net. Les membres de l’équipe Phalanger ont d’ailleurs ré-écrit en PHP toute la partie code d’une application de démonstration bien connue des développeurs ASP.NET. Elle se nomme « ASP.NET Personal Web Site Starter Kit », et comme son nom veut le signifier, il s’agit d’une application de démonstration permettant aux développeurs d’explorer le fonctionnement et les techniques de programmation classiques employées dans l’écriture d’une application Web dont le propos est ici d’etre un site Web personnel assez standard dans lequel vous pouvez publier entre autre des galeries de photos. Le code de cette application de démonstration est téléchargeable depuis l’espace du projet Phalanger sur CodePlex. Le lien est fourni en fin d’article.

S’agissant d’une application ASP.NET a part entiere, et bien qu’étant écrite en langage PHP, cette application a acces a toutes les fonctionnalités et les services standard proposés par ASP.NET 2.0. Ainsi, vous remarquerez que chaque page de l’application comporte en entete la référence a une page maitre définissant l’apparence et la disposition des zones de contenus dans la page. Il s’agit d’un systeme de modele de pages standard proposé par ASP.NET et qui se nomme « Master Pages ». Ainsi on retrouve en début de la page d’accueil Default.aspx la directive suivante :

<%@    Page Language="PHP" MasterPageFile="~/Default.master" Title="Your Name Here | Home" CodeFile="Default.aspx.php" Inherits="Default_aspx" %>

Il s’agit d’une directive agissant au niveau global de la page, précisant qu’elle doit etre compilée avec le compilateur PHP, et que la disposition et les styles de ses zones de contenu sont définis dans la page maître nommée Default.master et que le code associé aux différents évenements qu’elle expose est placé dans le fichier de code source nommé Default.aspx.php.

En explorant la page Default.aspx, vous remarquerez aussi l’utilisation des contrôles standards prenant en compte la gestion des profils utilisateur : inscription, gestion des mots de passe, statut authentifié ou non, gestion des rôles. C’est autant de services courants d’une application Web que le développeur utilisant ASP.NET 2.0 n’aura pas a réécrire depuis zéro, puisqu’ils sont fournis en standard par la plate-forme. La Figure 2 présente la définition des contrôles de login standard au sein de notre page Default.aspx.

Fig. 2 : La définition du composant standard de login dans l’application

Autre fonctionnalité standard proposée par ASP.NET 2.0 et dont cette application tire parti : le support des themes visuels. Vous trouverez dans le répertoire App_Themes de l’application deux répertoires contenant la définition et les différents éléments constitutifs de deux themes visuels de l’application : le theme Black et le theme White. La Figure 3 vous donne un aperçu de ces deux themes visuels. Pour passer d’un theme a l’autre, modifiez la directive correspondante dans le fichier web.config qui contient certains parametres de configuration de l’application :

<system.web>
     <pages styleSheetTheme="White">
...
</system.web>

Fig. 3 : Les deux différents themes visuels proposés par l’application, Black et White

Enfin, comme nous le verrons un peu plus tard, le fait de pouvoir développer une application ASP.NET en PHP permet aussi au développeur d’accéder au framework Microsoft Ajax qui permet au développeur d’écrire des pages avec une forte interactivité grâce a Ajax en n’écrivant pratiquement aucune ligne de code JavaScript.

Applications client riche « Windows Forms »

Bien que ça ne soit sans doute pas la premiere utilisation que vous en ferez, sachez néanmoins qu’il est possible d’écrire des applications Windows Forms avec Phalanger. Toutefois, dans l’état actuel des choses, et surtout en l’absence d’un concepteur visuel de formulaires intégré a Visual Studio, cette fonctionnalité est d’un intéret pratique assez limité. Il s’agit plutôt d’une preuve de concept pour le moment. Vous pouvez étudier l’application d’exemple fournie avec Phalanger et qui se trouve dans le répertoire C:\Program Files\Phalanger v2.0\Samples\WinForms.

Support de Visual Studio 2005

Avec la version 2.0 Beta 3, l’équipe de Phalanger a introduit le support de Visual Studio 2005. Cette fonctionnalité est accessible aux développeurs utilisant toute édition de Visual Studio 2005, a l’exception des éditions Express. Dans la version Beta 3, le support de Visual Studio ne fait pas partie de l’installation de base de Phalanger, vous devrez donc télécharger le package d’installation séparément depuis l’espace du projet Phalanger sur CodePlex (lien fourni en fin d’article).

Cette extension apporte a Visual Studio la possibilité de créer les nouveaux types de projets suivants, via la boite de dialogue présentée par la Figure 4.

  • Applications en mode Console, en mode de compilation « Legacy » ou en mode « Pure »
  • Applications Windows Forms, en mode Legacy ou Pure
  • Applications Web PHP (mode Legacy)
  • Applications Web ASP.NET 2.0 utilisant le langage PHP pour le code-behind (mode Pure)
  • Services Web XML
  • Bibliotheque de classes

Fig. 4 : Les différents types de projets proposés par l’extension pour Visual Studio 2005

Au-dela de simplement vous proposer de créer un squelette d’application, le support de Visual Studio par Phalanger propose une fonctionnalité tres intéressante pour le développeur : le débogueur au niveau code source, avec la possibilité de poser des points d’arret et d’observer les valeurs des différentes variables et instance de classes. La Figure 5 présente le débogueur en action au sein d’une application Web ASP.NET écrite en PHP.

Fig. 5 : Le débogueur en action au sein de Visual Studio 2005

Interopérabilité entre les codes PHP et .NET

Par interopérabilité entre PHP et .NET, il est question d’utiliser des classes ou bibliotheques écrites dans n’importe quel langage .NET depuis une application Phalanger écrite en PHP, et également de façon symétrique, d’utiliser des classes ou bibliotheques écrites en PHP avec Phalanger depuis une quelconque application .NET. Du fait de la nature dynamique du langage PHP, chose que Phalanger implémente via un certain nombre de mécanismes particuliers, et alors que l’environnement d’exécution de .NET n’offre pas en standard de support des langages dynamiques, l’équipe du projet Phalanger a du effectuer un certain nombre de choix de conception et mettre au point des mécanismes permettant de marier ces deux mondes dynamiques et non dynamiques. Voyons ceci en détails.

Utilisation de classes .NET depuis PHP

Depuis Phalanger, que votre application s’exécute en mode Legacy ou en mode Pure, vous pouvez accéder a n’importe quelle classe .NET, qu’il s’agisse d’une des classes standard de la Base Class Library  ou bien d’un de vos propres codes. Pour cela, Phalanger reprend la syntaxe proposée pour PHP6. Le listing 7 présente le code d’un programme qui affiche l’heure systeme en utilisant la propriété statique Now de la classe DateTime du .NET Framework,  cette classe est contenue dans l’espace de nommage System.

Listing 7 :
<?php
       import namespace System;
       $dtnow = System:::DateTime::$Now;      
       $heure = $dtnow->ToLongTimeString();          
       echo "Il est $heure \n";
       fgets(STDIN);
       return 0;
?>

On notera la syntaxe assez particuliere avec les ‘:::’ qui notent un espace de nommage et les ‘::’ qui indiquent un membre ou une propriété de la classe en question.

Utilisation de classes PHP depuis .NET

Bien qu’un des principaux avantages de la plate-forme .NET soit de permettre l’utilisation au sein d’un meme programme de bibliotheques de codes écrits dans divers langages (C#, VB.NET, etc…), et ceci de façon totalement transparente pour le développeur grâce aux mécanismes définis par le CLS, alias Common Language Specification, il en va différemment dans le cas de Phalanger. En effet, Phalanger implémentant en interne des mécanismes d’un langage dynamique, les méthodes effectivement compilées par le compilateur Phalanger ont des signatures différentes de celles écrites par le développeur.

Afin de pouvoir invoquer les méthodes d’une classe écrite en PHP et compilée avec Phalanger depuis un autre code .NET, il est nécessaire d’utiliser un attribut spécifique avec lequel on décorera la classe ou les méthodes PHP que l’on souhaite invoquer depuis .NET avec l’attribut [Export] , comme ceci est indiqué dans l’exemple fourni dans le Listing 8.

Listing 8 :
<?
import namespace System;
namespace ArticlePhalanger
{
       [Export]
       class Customer
       {
             static $lastID;
             public $CustomerID;
             public $CustomerFirstName;
             public $CustomerLastName;
             public $CustomerEmail;

             function __construct($firstname, $lastname, $email)
             {
              $this->CustomerID = $lastID+1;
              $this->CustomerFirstName = $firstname;
              $this->CustomerLastName = $lastname;
              $this->CustomerEmail = $email;
             }
       }
}
?>

En supposant que l’on ait placé le code précédent dans un fichier source nommé Customer.php, on le compile en ligne de commande de la façon suivante, afin de produire la DLL nommée Customer.dll :

phpc Customer.php /target:dll /pure+ /verbose+

Ensuite, depuis une application .NET – par exemple ici écrite en langage C# - on place une référence sur notre DLL et on peut ensuite écrire du code qui va instancier et utiliser notre classe Customer écrite en PHP. L’exemple correspondant est présenté dans le Listing 9.

Listing 9 :
using System;
using System.Collections.Generic;
using System.Text;
using ArticlePhalanger;  // On importe le namespace de notre classe Customer

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
         Customer cust = new Customer("John", "Doe", "john.doe@acme.com");
         Console.WriteLine("Le client est " + cust.CustomerFirstName + " " + cust.CustomerLastName);
         Console.ReadLine();
        }
    }
}

Vous noterez que dans notre exemple, nous avons fait porter l’attribut [Export] globalement sur la classe Customer, car l’attribut précede la ligne définissant cette classe. Pour certains besoins particuliers, sachez que vous pouvez aussi utiliser cet attribut au niveau d’une propriété ou d’une méthode de votre classe PHP, comme nous vous l’indiquons dans le Listing 10.

Listing 10 :
static $lastID;
public $CustomerID;
[Export]
public $CustomerFirstName;
[Export]
public $CustomerLastName;
[Export]
public $CustomerEmail;

 

Microsoft Ajax et Phalanger : le Personal WebSite Starter Kit

Nous avons parlé plus tôt dans cet article de l’application complete de démonstration proposée par les développeurs de Phalanger : le Personal Web Site Starter Kit. Nous avons rapidement regardé quelques aspects de cette application pour arriver a la conclusion qu’il s’agit d’une application ASP.NET 2.0 a part entiere.

Comme nous l’avons évoqué un peu avant, il est non seulement tout a fait faisable, mais en plus tres facile, d’étendre cette application en lui ajoutant des fonctionnalités de type Ajax, sans écrire une seule ligne de code Javascript grâce aux différents composants de Microsoft ASP.NET Ajax.

Microsoft Ajax est en fait un Framework Ajax qui comporte trois parties principales : Une bibliotheque Javascript client qui n’est pas liée a ASP.NET sur le serveur, et qui peut donc etre totalement utilisée dans des applications web, quelle que soit la technologie serveur utilisée (ASP.NET, Java, PHP, …). En second lieu, Microsoft Ajax propose un certain nombre de contrôles serveur qui vont nécessiter d’utiliser ASP.NET, et enfin, le projet collaboratif Microsoft Ajax Control Toolkit vise a produire une centaine de contrôles ou d’extenders pour des composants ASP.NET, permettant de disposer sans difficulté et généralement sans codage – juste par configuration de ces contrôles et extenders – de fonctionnalités Ajax dans son application ASP.NET.

Microsoft Ajax est fourni gratuitement et proposé sous licence Shared Source : sous licence SS-PL pour la bibliotheque de script et le Control Toolkit, et sous licence SS-RL pour le reste.

Utilisation de Microsoft Ajax avec Phalanger : Le composant UpdatePanel

Sans entrer trop dans les détails, car ceux-ci nécessiteraient quelques explications qui dépasseraient largement le cadre de cet article, voyons comment nous pourrions éviter de recharger intégralement toute la page de notre application quand nous parcourrons un album et que nous passons d’une photo a l’autre. Ceci provoque clignotement de la page dans le navigateur, et c’est typiquement le type de comportement qu’Ajax permet d’éviter, en apportant un meilleur confort de navigation aux utilisateurs.

Pour pouvoir utiliser Microsoft Ajax dans notre application, nous devons commencer par télécharger et installer Microsoft ASP.NET Ajax version 1.0 depuis http://ajax.asp.net . Ensuite, nous devrons modifier le contenu de notre fichier web.config afin d’y déclarer les composants et handlers nécessaires au fonctionnement des composants serveur de Microsoft Ajax.

C’est la partie la plus longue de l’opération. Ensuite, pour utiliser les contrôles Ajax dans notre page, il nous suffit d’ajouter un composant ScriptManager, qui a entre autres pour responsabilité de gérer l’envoi des scripts Javascript au navigateur client en fonction de ses besoins, puis d’encapsuler la portion de notre page pour laquelle nous voulons que les modifications de contenu se fasse de façon asynchrone sans rechargement complet de la page.

Vous trouverez dans le Listing 11 un extrait de la page Details.aspx de notre Starter Kit, a laquelle nous avons ajouté le fameux composant UpdatePanel. Ce composant  assez magique prend automatiquement en charge l’ensemble des contrôles que l’on place a l’intérieur de sa propriété ContentTemplate et gere pour eux les échanges en mode Asynchrone avec le serveur via des requetes Ajax de type XmlHttpRequest.

Listing 11 :
<asp:content id="Content1" contentplaceholderid="Main" runat="server">
 <asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>
 <div class="shim solid"></div>
 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>     
       <div class="page" id="details">
       <%-- Toute action ou modification du contenu des composants et contrôles contenus dans cette balise DIV « details » seront effectués en asynchrone et gérés automatiquement par le composant UpdatePanel qui l’encadre --%>
       </div>
    </ContentTemplate>  
 </asp:UpdatePanel>

Malheureusement, il est assez difficile de décrire le résultat produit, car le principe de ceci est tres visuel. E vous encourage donc a expérimenter le fonctionnement de ce contrôle UpdatePanel par vous-meme.

Les contrôles du Microsoft Ajax Control Toolkit

Dans le meme esprit, maintenant que nous avons activé Microsoft Ajax, nous pouvons en profiter pour ajouter par ci par la quelques contrôles issus de la collection de composants du Microsoft Ajax Control Toolkit. Vous pouvez expérimenter le fonctionnement et le comportement de ces contrôles depuis le site du projet, dont l’adresse est donnée en fin d’article.

Ici, nous avons choisi d’utiliser deux extenders TextBoxWatermark au niveau des deux zones de saisie du nom d’utilisateur et du mot de passe de notre application Starter Kit. Sur les captures d’écran de la Figure 6, vous voyez a gauche l’application sans ces contrôles, et a droite cette meme application avec ces contrôles activés. Il est particulierement intéressant de noter que ces contrôles viennent simplement « étendre » le comportement des contrôles existants dans l’application (ici de nos deux champs de saisie) et qu’ils ne nécessitent aucune modification au niveau du code de l’application. Leur utilisation est totalement transparente.

Fig. 6 : les contrôles de login, sans et avec les extenders TextBoxWatermark

Conclusion partielle

De Phalanger a Microsoft Ajax, en passant par ASP.NET 2.0 et Web Forms, nous avons survolé de nombreux sujets, qui chacun mériteraient plusieurs articles pour les présenter de façon correcte. J’espere que cet article vous aura donné envie d’en savoir plus et que vous aurez plaisir a découvrir ces technologies et ces outils.

Que vous ayez des applications PHP existantes avec des besoins d’intégration aux technologies Microsoft, ou bien que vous ayez a développer des nouvelles applications Web en ASP.NET amis que vous souhaitiez continuer a utiliser votre langage préféré – PHP pour ne pas le nommer – alors le projet Phalanger est certainement un de vos plus précieux alliés.

Profitons de la fin de cet article pour saluer tous les membres de l’équipe Phalanger pour ce remarquable travail qu’ils ont fourni, en espérant qu’ils continueront encore longtemps a nous surprendre et a nous émerveiller. Good job, guys!

Liens utiles et Téléchargements

Le projet Phalanger :
http://www.php-compiler.net/
Téléchargement de Phalanger sur CodePlex :
https://www.codeplex.com/Phalanger
Téléchargement de l’extension MySQL pour Phalanger sur CodePlex :
https://www.codeplex.com/PhalangerMySQL
Téléchargement du Personal Web Site Starter Kit en PHP et de l’Intégration de Phalanger a Visual Studio 2005 (Beta) :
https://www.codeplex.com/Phalanger/Release/ProjectReleases.aspx
Cours et tutoriels sur ASP.NET en Français, avec le « Coach ASP.NET » :
https://www.microsoft.com/france/msdn/aspnet/coach/coach.mspx
Microsoft ASP.NET Ajax :
http://ajax.asp.net/
Microsoft Ajax Control Toolkit :
https://www.asp.net/ajax/ajaxcontroltoolkit/

L’auteur

Christophe Lauer est en charge des relations techniques avec les développeurs chez Microsoft France. Dans ce cadre, il fait la promotion de la plate-forme de développement Web de Microsoft, des outils associés ainsi que de la plate-forme Windows Live. Ses domaines et technologies de prédilection vont de ASP.NET a Microsoft Ajax en passant par IIS 7 et IE7, sans oublier les nombreux services de la plate-forme Windows Live et leurs APIs.

Son blog : https://blogs.msdn.com/clauer/