I. Introduction

La communication entre des plates-formes différentes a toujours existé. Au fil des années l'évolution a permis le rapprochement entre sociétés. L'interopérabilité des langages est de plus en plus importante, surtout à travers le Web. Aujourd'hui, vous pouvez communiquer plus facilement avec les langages dynamiques sous licence payante et les solutions open source.

Phalanger est le nom de code d'un projet open source visant à faire de PHP un langage de la famille des langages de la plate-forme .NET. Il fournit à des applications PHP un environnement d'exécution rapide et compatible avec la vaste gamme des codes et applications PHP existantes. Phalanger donne aux développeurs d'applications web la possibilité d'exploiter la facilité, l'efficacité et la rigueur du langage PHP avec la puissance et la richesse fonctionnelles de la plate-forme .NET.

Ce tutoriel a pour but de faire découvrir Phalanger, vous montrer comment créer des applications PHP dans Visual Studio, comment exploiter les différentes technologies du framework .NET en utilisant le langage PHP, utiliser les classes .NET dans PHP et vice versa et comment configurer un projet PHP existant avec Phalanger.

II. Prérequis

Pour une bonne compréhension de ce tutoriel vous devrez disposer des connaissances de base en PHP et/ou en développement .NET.

Le but de ce tutoriel introductif étant de vous montrer les différentes fonctionnalités et possibilités que vous offre Phalanger sur la plate-forme .NET, nous n'entrerons pas dans les détails lors de l'évocation des différentes technologies .NET (ASP.NET, Silverlight…) pouvant être utilisées avec le langage PHP.
Pour une technologie qui attire particulièrement votre attention et dont vous ne disposez pas des connaissances de base pour la compréhension de ce tutoriel, merci de bien vouloir vous référer aux différents articles introductifs disponibles sur Developpez.com.

III. Historique et évolution de Phalanger

Le projet Phalanger a démarré au début de l'année 2003 à la faculté de Mathématiques et de Physique de l'université Charles de Prague en République tchèque. A la base c'était un projet réunissant six étudiants (dont certains ont été recrutés par Microsoft faut le dire) autour de la possibilité de compiler des langages dynamiques (en particulier le langage PHP) sur la plate-forme .NET. A ce moment le projet portait le nom de PHP.NET.

La première version de Phalanger a été publiée en février 2006 et proposait juste un compilateur pour PHP sur la plate-forme .NET, un environnement d'exécution compatible avec PHP4 et PHP5.

Phalanger est actuellement disponible en version 2.0, dans cette version, plusieurs fonctionnalités ont été réécrites et le compilateur a été mis à jour. Cette version fait de PHP un langage à part entière de la plate-forme .NET tout comme C# ou VB.NET et apporte le support et l'intégration de Phalanger à l'EDI Visual Studio, l'interopérabilité entre .NET et PHP, et des exemples d'applications ASP.NET 2.0 écrites en PHP.

IV. Environnement de travail

Pour les exemples que vous trouverez dans cet article, nous avons utilisé les langages et plates-formes suivants :

  • Windows XP ;
  • IIS 6.0 ;
  • .Net Framework 3.5 ;
  • Phalanger 2.0 ;
  • Visual Studio 2008.

V. Téléchargement et Installation de Phalanger

Avant toute installation de Phalanger vous devez disposer des éléments suivants :

  • Windows (Xp, Vista, Seven) ;
  • Framework.NET (à partir de la version 2.0) ;
  • IIS 6.0 ou plus (au cas où vous voudriez exécuter les sites web exemples joints au projet).

Téléchargez Phalanger sur le site Codeplex, le lien est fourni en fin d'article. Vous y trouverez un Msi d'environ 8,0 Mo.

Double-cliquez sur le Msi pour lancer l'installation après que vous vous soyez assuré que votre machine comporte bel et bien le framework .NET 2.0.

Suivez les étapes d'installation présentées par l'assistant.

Image non disponible

Dans le cas où vous souhaitez que le programme d'installation configure automatiquement les applications d'exemples, cochez l'une des cases ci-dessus en fonction de la version d' IIS que vous avez sur votre poste, ensuite cliquez sur Next pour continuer l'installation.

VI. Mode de compilation avec Phalanger

Phalanger offre deux modes de compilation différents pour les applications à savoir :

  • Legacy mode (mode standard PHP/CLR) ;
  • Pure mode (Pure PHP/CLR).

VI-A. Mode de compilation Legacy

Le "Legacy mode" (mode standard PHP pour le Common Language Runtine) est le mode permettant d'exécuter des applications PHP existantes sans modification de leur code source et de créer des applications Phalanger qui seront compilées dans un mode entièrement compatible avec l'interpréteur PHP officiel.

Le mode legacy est le mode par défaut dans Phalanger, dans la version 1.0 celui-ci était l'unique mode de compilation présent dans Phalanger.

En mode legacy, les scripts des applications sont exécutés séquentiellement. Cela signifie que l'exécution des applications commence avec un script principal. Le code dans ce script est exécuté ligne par ligne et les applications peuvent utiliser les directives PHP standard comme requiere() et include() pour introduire dynamiquement des portions de code sous la forme de fichiers externes.

Exemple :

 
Sélectionnez

<?php
echo "Hello World";
sleep(10);
?>

Soit le code ci-dessus, qui est parfaitement correct en PHP4 ou PHP5, peut être compilé en mode legacy avec Phalanger via la ligne de commande suivante :

 
Sélectionnez

phpc.exe testfile.php /target:exe /pure- /verbose- /out:testfile.exe
Image non disponible

Ce qui génère un fichier exécutable testfile.exe et à l'exécution de celui-ci on obtient le résultat suivant :

Image non disponible

L'option "pure -" permet de désactiver le mode pure et activer par défaut le mode legacy. La compilation du même bout de code avec le mode pure produit une erreur du compilateur à cause de l'absence de la fonction Main() comme l'illustre la capture suivante.

Image non disponible

C'est grâce au mode legacy que vous pouvez exécuter sans modification du code source (juste quelques modifications du fichier de configuration) des applications PHP existantes telles que : PhpMyAdmin, WordPress , PhpBB…

VI-B. Mode de compilation pure

Le "Pure mode " (mode pur PHP pour le Common Language Runtine) a vu son apparition à partir de la version 2.0 de phalanger. Ce mode fait des applications Phalanger de purs projets de la logique des applications .NET à l'instar de C#. Il fait de PHP un langage de premier choix de la famille des langages du CLR.

En mode Pure les scripts sont fusionnés en un assemblage lors de la compilation (les inclusions ne sont plus autorisées, et on perd l'aspect dynamique du langage) et chaque script ne doit contenir que des déclarations de haut niveau des classes et des fonctions.

La compilation d'une application en ce mode donne naissance à un assemblage sous la forme de code Microsoft Intermediate Language(byte code). Le mode Pure est un mode très intéressant pour les développeurs .NET, car il permet d'utiliser le langage PHP pour créer des applications WinForms, Console ou encore de mettre en œuvre l'interopérabilité dans les deux sens entre code .NET et PHP à travers les mécanismes d'objets de type héritage, spécialisation...

Ce mode permet aussi de développer des applications web ASP.NET 2.0 en utilisant PHP comme code métier et Silverlight.

En mode Pure le code de l'exemple ci-dessus (dans la section de compilation en mode legacy) doit être adapté comme suit :

 
Sélectionnez

<?php
class Program
{	
  static function Main()
	{	
	  echo "Hello World";
	  fgets(STDIN);
	  return 0;
	}
}
?>

Vous constatez l'ajout de la fonction Main().

VII. Prise en charge de Visual Studio

Depuis la version 2.0 de Phalanger, le support de l'environnement de développement Visual Studio 2008 est pris en charge. Avant toute utilisation de Phalanger dans Visual Studio, vous devez installer l'intégrateur de Phalanger dans Visual Studio (Phalanger Visual Studio Integretion).

VII-A. Installation de Phalanger Visual Studio Integration

Pour des personnes disposant de Visual studio 2008, l'exécutable d'intégration dans Visual Studio 2008 est disponible sur le site CodePlex, le lien est fourni en fin d'article.

Après avoir téléchargé le MSI, procédez à l'installation et suivez toutes les étapes nécessaires à l'installation de l'extension.

Image non disponible

Ceux ne disposant pas de Visual Studio et désirant se lancer dans la programmation avec PHP dans Visual Studio, pas de souci. Microsoft vous donne la possibilité de télécharger et d'installer gratuitement Visual Studio Shell 2008, qui est une version vide de Visual Studio sans aucun langage et modèle de projet installé.

Le lien pour le téléchargement de VS Shell 2008 est également fourni en fin d'article.

VII-B. Modèles de projets Phalanger dans Visual Studio

Après installation de l'extension Phalanger qui permet l'intégration de celui-ci dans Visual Studio, PHP devient un langage .NET de premier choix dans la plate-forme .NET.

Je tiens à souligner que vous ne pouvez pas utiliser cette extension avec une version express de Visual Studio.

Maintenant à l'aide de notre EDI nous allons voir ce que Phalanger nous propose et différents types d'applications et technologies qui sont supportées par Phalanger dans Visual Studio.

Lancez Visual Studio, cliquez sur le menu Fichier/Nouveau projet. Vous constaterez que " Phalanger " est ajouté parmi les types de projets. Cliquez dessus comme l'illustre la figure ci-dessous.

Image non disponible

La liste des modèles de projets Phalanger disponibles par défaut s'affiche, vous avez entre autres :

  • Phalanger Class Library : qui permet de créer une bibliothèque de classes .NET utilisant le langage PHP (en mode de compilation pure), qui pourra être utilisée dans n'importe quelle application .NET ;
  • Phalanger WinForms Application : qui permet de créer une application riche WinForms en mode pure compilation PHP ;
  • PHP console Application : qui permet de créer une application console PHP compatible en mode de compilation legacy ;
  • Phalanger console application : qui permet de créer une application console en mode pure compilation PHP ;
  • Extension : qui permet de créer une bibliothèque de classes PHP en mode pure compilation PHP qui se comporterait davantage comme des extensions managées PHP ;
  • PHP Windows Application : qui permet de créer une application PHP compatible Windows application.

En ce qui concerne les sites web, les modèles de projets suivants sont proposés : Phalanger PHP Web ; Empty Phalanger Web Project et Phalanger Silverlight Web.

Image non disponible

VII-C. Application WinForms PHP

Comme vous avez pu le constater dans la liste des différents modèles de projets que vous pouvez créer avec Phalanger, il est possible de créer une application client riche WinForms PHP avec Phalanger dans Visual Studio.

Tout comme avec les projets WinForms C# ou VB.NET, Phalanger met à votre disposition un concepteur visuel de formulaire intégré à Visual Studio qui contient tous les contrôles et outils standard que vous connaissez (Button, Label, Combobox, Grille…)

Image non disponible

En plus de cela vous avez également le gestionnaire d'événements.

Le gestionnaire d'événements a permis une évolution significative dans l'interaction entre PHP et les classes NET.

Vous avez aussi le débogueur au niveau du code source, avec la possibilité de poser des points d'arrêts et d'observer les valeurs des différentes variables et instances de classes.

Image non disponible

A titre d'exemple, nous allons créer un nouveau projet WinForms PHP avec un petit formulaire de connexion contenant les champs Login, Pwd et un bouton Connexion et Annuler.

Le résultat obtenu à la compilation est le suivant :

Image non disponible

Et l'extrait du code source PHP généré est le suivant :

 
Sélectionnez

<?
    import namespace WindowsApplication1;
    
    namespace WindowsApplication1 {
        
        [Export]
        partial class Form1 extends System:::Windows:::Forms:::Form {
            
            private $button1;
            
            private $button2;
            
            private $label1;
            
            private $label2;
            
            private $textlogin;
            
            private $textpwd;
            
            private $components = NULL;
            
            public function __construct()
                : parent() {
                $this->InitializeComponent();
            }
            
            public function InitializeComponent() {
                $this->textlogin = new System:::Windows:::Forms:::TextBox();
                $this->textpwd = new System:::Windows:::Forms:::TextBox();
                $this->button1 = new System:::Windows:::Forms:::Button();
                $this->button2 = new System:::Windows:::Forms:::Button();
                $this->label1 = new System:::Windows:::Forms:::Label();
                $this->label2 = new System:::Windows:::Forms:::Label();
                $this->SuspendLayout();
                // 
                // textlogin
                // 
                $this->textlogin->Location = new System:::Drawing:::Point(110, 22);
                $this->textlogin->Name = "textlogin";
                $this->textlogin->Size = new System:::Drawing:::Size(170, 20);
                $this->textlogin->TabIndex = 0;
                // 
                // textpwd
                // 
                $this->textpwd->Location = new System:::Drawing:::Point(110, 78);
                $this->textpwd->Name = "textpwd";
                $this->textpwd->PasswordChar = '*';
                $this->textpwd->Size = new System:::Drawing:::Size(170, 20);
                $this->textpwd->TabIndex = 1;
                // 
                // button1
                // 
                $this->button1->Location = new System:::Drawing:::Point(184, 134);
                $this->button1->Name = "button1";
                $this->button1->Size = new System:::Drawing:::Size(85, 29);
                $this->button1->TabIndex = 2;
                $this->button1->Text = "Annuler";
                $this->button1->UseVisualStyleBackColor = true;
                // 
                // button2
                // 
                $this->button2->Location = new System:::Drawing:::Point(17, 134);
                $this->button2->Name = "button2";
                $this->button2->Size = new System:::Drawing:::Size(81, 26);
                $this->button2->TabIndex = 3;
                $this->button2->Text = "Connexion";
                $this->button2->UseVisualStyleBackColor = true;
                $this->button2->Click->Add(new System:::EventHandler(array($this, "button2_Click")));
                // 
                // label1
                // 
                $this->label1->AutoSize = true;
                $this->label1->Location = new System:::Drawing:::Point(12, 25);
                $this->label1->Name = "label1";
                $this->label1->Size = new System:::Drawing:::Size(33, 13);
                $this->label1->TabIndex = 4;
                $this->label1->Text = "Login";
                // 
                // label2
                // 
                $this->label2->AutoSize = true;
                $this->label2->Location = new System:::Drawing:::Point(14, 81);
                $this->label2->Name = "label2";
                $this->label2->Size = new System:::Drawing:::Size(28, 13);
                $this->label2->TabIndex = 5;
                $this->label2->Text = "Pwd";
                // 
                // Form1
                // 
                $this->AutoScaleDimensions = new System:::Drawing:::SizeF(6, 13);
                $this->AutoScaleMode = System:::Windows:::Forms:::AutoScaleMode::Font;
                $this->ClientSize = new System:::Drawing:::Size(292, 172);
                $this->Controls->Add($this->label2);
                $this->Controls->Add($this->label1);
                $this->Controls->Add($this->button2);
                $this->Controls->Add($this->button1);
                $this->Controls->Add($this->textpwd);
                $this->Controls->Add($this->textlogin);
                $this->Name = "Form1";
                $this->StartPosition = System:::Windows:::Forms:::FormStartPosition::CenterParent;
                $this->Text = "Form1";
                $this->Load->Add(new System:::EventHandler(array($this, "Connexion_Load")));
                $this->ResumeLayout(false);
                $this->PerformLayout();
            }
            
            private function button1_Click(System:::Object $sender, System:::EventArgs $e) {
            }
            
            private function button2_Click(System:::Object $sender, System:::EventArgs $e) {
            }
            
            private function Connexion_Load(System:::Object $sender, System:::EventArgs $e) {
            }
        }
    }
?>

Vous pouvez également étudier l'application d'exemple fourni avec Phalanger qui se trouve dans le répertoire\Samples\WinForms du dossier d'installation de Phalanger.

VII-D. Ecriture d'applications web ASP.NET 2.0 avec PHP

Avec le projet Phalanger, il est maintenant possible d'utiliser le langage PHP pour le développement des applications Web ASP.NET 2.0 au même titre que les autres langages .NET comme C# ou encore VB.net.

Il vous permet de créer des applications ASP.NET pouvant exploiter toutes les options disponibles dans une application ASP.NET standard (Contrôles ASP.NET, Master Pages, Thèmes…) en utilisant le langage PHP pour la partie code métier. Ceci vous permet à la fois d'exploiter les riches fonctionnalités d'ASP.NET et utiliser un langage avec lequel vous êtes déjà familier (pour les développeurs PHP).

Pour illustrer nos propos, nous allons reprendre ici un exemple qui est livré avec Phalanger. Il se trouve dans le dossier \WebRoot\Samples\ASP.NET du dossier d'installation de Phalanger.

Ouvrons la page Login.aspx avec Visual Studio et observons sa structure.

On se rend directement compte qu'il contient la directive standard des pages ASP.NET @Page, et que l'attribut CodeFile pointe sur un fichier .php.

 
Sélectionnez

<%@ Page Language="PHP" AutoEventWireup="false" CodeFile="Login.aspx.php" Inherits="Login" Title="Login page" %>

La suite du code présente un formulaire ASP.NET contenant des contrôles ASP.NET standard (TextBox, Form, Button…)

 
Sélectionnez

<form id="form1" runat="server">
        <center>
            <table border="0" cellpadding="0" cellspacing="5">
                <tr>
                    <td colspan="2" style="text-align: center">
                	    <b>Please enter your login name and password:</b>
                    </td>
                </tr>
                <tr>
                    <td style="text-align: right">
                        Login:
                    </td>
                    <td>
                        <asp:TextBox ID="TextBoxLogin" runat="server" Width="200px" />
                    </td>
                </tr>
                <tr>
                    <td style="text-align: right">
                        Password:
                    </td>
                    <td>
                        <asp:TextBox ID="TextBoxPassword" runat="server" Width="200px" TextMode="Password" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2" style="text-align: center">
                        <asp:Button ID="ButtonSubmit" runat="server" Text="Submit" OnClick="ButtonSubmit_Click" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <asp:CustomValidator ID="CustomLoginValidator" runat="server" Display="Dynamic"
                        ErrorMessage="Invalid login or password! Please try again." Font-Bold="True" />
                    </td>
                </tr>
            </table>
        </center>
    </form>

Et dans le fichier code métier Login.aspx.php, on retrouve le code PHP suivant :

 
Sélectionnez

<?
	import namespace System;
	import namespace System:::Data;
	import namespace System:::Configuration;
	import namespace System:::Collections;
	import namespace System:::Web;
	import namespace System:::Web:::Security;
	import namespace System:::Web:::UI;
	import namespace System:::Web:::UI:::WebControls;
	import namespace System:::Web:::UI:::WebControls:::WebParts;
	import namespace System:::Web:::UI:::HtmlControls;

	partial class Login extends System:::Web:::UI:::Page
	{
		protected function ButtonSubmit_Click($sender, $e)
		{
			$login = $this->TextBoxLogin->Text;
			$passw = $this->TextBoxPassword->Text;
		
			if (FormsAuthentication::Authenticate($login, $passw))
			{
				FormsAuthentication::RedirectFromLoginPage($login, false);
			}
			else
			{
				$this->CustomLoginValidator->IsValid = false;
			}
		}
	}
?>

Pour plus de détails et d'exemples sur l'utilisation du code PHP dans une application ASP.NET, reportez-vous à l'application ASP.NET Personnal Web Site Starter.

Les responsables du développement de Phalanger ont réécrit en PHP toute la partie code métier de l'application de démonstration bien connue des développeurs ASP.NET "Personnal Web Site Starter KIT" comme preuve de faisabilité. Elle donne un aperçu de l'utilisation de Phalanger avec ASP.NET car l'application utilise tous les services et fonctionnalités standard proposés par ASP.NET.

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.

VII-E. Ecriture d'applications Silverlight avec PHP

Silverlight est une plate-forme de développement permettant de créer des applications web riches, des animations, des jeux, des graphiques pouvant communiquer de façon interactive avec l'utilisateur.

Comme avec des applications ASP.NET 2.0, depuis la version 2.0, Silverlight permet d'exécuter du code .NET.

Avec la version 2 de Phalanger, il est désormais possible de créer des applications web Silverlight riches en utilisant du code PHP.

Comme vous avez pu le constater dans les modèles de projets plus haut, il existe un modèle Phalanger Silverlight Web pour les applications Silverlight.

Pour créer une application web Silverlight utilisant PHP, sélectionnez ce modèle. Vous vous rendrez compte que vous avez à votre disposition toute la panoplie de contrôles (DataGrid, Button, Canvas) et fonctionnalités Silverlight que vous pouvez exploiter avec le langage PHP.

L'application créée a, par défaut, la structure des applications Silverlight comme vous pouvez le constater avec la capture de l'explorateur de solution ci-dessous.

Image non disponible

Le fichier Default .xaml est pratiquement l'élément fondamental d'une application Silverlight. Il est utilisé pour décrire les éléments de l'interface utilisateur de l'application. Il permet de créer des éléments comme les graphiques, des animations, qui sont regroupés dans un conteneur (Canvas).

 
Sélectionnez

 <Canvas x:Name="parentCanvas"
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:php="clr-namespace:PHP.Silverlight;assembly=ClientBin/PhpNetCore.dll"
    Width="800"
    Height="600"
    Background="#fff0f0f0">

  <php:PhalangerLoader Source="default.phpx" />
  <TextBlock x:Name="hello" FontSize="30" Foreground="#FF003090" Text="Click here!" />
</Canvas>

Ce qui attire particulièrement notre attention dans ce fichier est la balise suivante :

 
Sélectionnez

<php:PhalangerLoader Source="default.phpx" />

Dont l'attribut " Source " pointe sur un fichier default.phpx contenant du code PHP.

 
Sélectionnez

<?
// Import useful .NET (Silverlight) namespaces, so we can use multimedia 
// things (Color, SolidColorBrush) and input stuff (MouseEventHandler)
import namespace System:::Windows:::Input;
import namespace System:::Windows:::Media;

// include utilities for PHP - defines $canvas (among other things)
include("slutils.phpx");

// function called by Silverlight when user clicks on the text
function OnClick()
{
	global $canvas;
	
	$canvas->hello->Text = "Hello from PHP!";
	$canvas->hello->Foreground = new SolidColorBrush(Color::FromRgb(64, 0, 160));
}

// attach the event handler for the 'MouseLeftButtonDown' event
$canvas->hello->MouseLeftButtonDown->Add
	(new MouseEventHandler("OnClick"));

?>

Il est intéressant de constater que le déploiement ne nécessite aucune configuration particulière auprès de l'hébergeur, que ce soit avec le serveur Apache ou IIS, tout marche normalement et vous n'avez même pas besoin que PHP soit installé.

A titre illustratif, le code source d'une démo d'un jeu fait en Silverlight avec PHP est disponible sur le site du projet le lien est fourni en fin d'article.

Image non disponible

VIII. Interopérabilité entre PHP et .NET

L'interopérabilité entre PHP et .NET permet d'exposer et utiliser les fonctionnalités des bibliothèques et classes PHP écrites avec Phalanger dans n'importe quelle application .NET, et de même utiliser les classes et bibliothèques .NET dans n'importe quelle application PHP.

VIII-A. Utilisation des classes PHP dans .NET

PHP est un langage dynamique, de ce fait, il est très simple et permet de résoudre beaucoup de tâches. PHP dispose de plusieurs fonctions puissantes qui n'ont pas leur équivalent en .NET. Grâce au projet Phalanger, vous pouvez utiliser des classes PHP dans n'importe quelle application .NET. Cependant du fait que PHP soit un langage dynamique, Phalanger implémente en interne des mécanismes d'un langage dynamique de ce fait, les méthodes effectivement compilées par le compilateur Phalanger ont des signatures différentes de celles écrites par le développeur.

Pour pouvoir invoquer les méthodes d'une classe PHP compilée avec Phalanger dans une application .NET, on doit utiliser l'attribut [Export] avec lequel on décorera la classe ou les méthodes PHP que l'on souhaite utiliser dans une application .NET.

A titre d'exemple nous allons créer une classe Operations avec des méthodes Addition() et Multiplication() comme l'illustre l'extrait de code ci-dessous.

 
Sélectionnez

<?
namespace Test
{
	[Export]

class Operation
{
    public $a = 0;
    public $b = 0;
	function __construct($v1, $v2)
	{
	   $this->a = $v1;
	   $this->b = $v2;
	}
	function Addition()
	{
	  return $this->a + $this->b;
	}
	function Multiplication()
	{
	  return $this->a * $this->b;
	}
}
}

?>

Notez la présence de l'attribut [Export].

Nous allons enregistrer notre classe dans un fichier nommé Operation.php, ensuite on va le compiler en invite de commande en mode pure pour générer la DLL correspondante en utilisant la ligne de commande suivante :

 
Sélectionnez

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

Cette commande va générer un fichier Operation.dll.

Nous allons maintenant faire appel aux méthodes de notre classe PHP dans une application .NET.

Dans votre application .NET ajoutez une référence à la dll et écrivez ensuite les lignes de code qui vont instancier et utiliser notre classe PHP comme l'illustre l'exemple ci-dessous en C#.

 
Sélectionnez

Using Test; 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Operation Op = new Operation(6, 8);
            Console.WriteLine("la somme est : " + Op.Addition());
            Console.WriteLine("le produit est : " + Op.Multiplication());
            Console.ReadLine();
        }
    }
}

VIII-B. Utilisation des classes .NET dans PHP

Phalanger vous donne la possibilité d'appeler dans votre code PHP des classes managées et librairies standard du Framework .NET ou les classes .NET que vous avez écrites vous-même quel que soit le langage(C#, VB.NET).

La syntaxe utilisée par Phalanger pour l'accès aux classes .NET depuis du code PHP est la même que celle de PHP 6. Que ce soit en mode legacy ou en mode pure compilation vous pouvez accéder à n'importe quelle classe .NET dans votre code PHP.

 
Sélectionnez

<?php
	import namespace System;
	$dtnow = System:::DateTime::$Now;		
	$yr = $dtnow->Year();		
	echo "Nous sommes en $yr \n";
	fgets(STDIN);
	return 0;
?>

Notez l'utilisation des " ::: " juste après l'espace de nommage et les " :: " juste après une méthode ou propriété de la classe.

IX. Configuration d'applications PHP existantes.

Comme nous l'avons mentionné plus haut, avec Phalanger, il est possible d'exécuter des applications PHP existantes comme WordPress, PHPmyAdmin ou encore PHPBB sur le Framework .NET sans modification de code. Mais cependant la configuration d'un site PHP existant pour une exécution avec Phalanger vous oblige de créer à la racine du dossier contenant l'application un fichier Web.Config.

Phalanger dans la gestion du répertoire d'une application web PHP, reprend le même principe de fonctionnement que les applications ASP.NET, ce qui signifie que la configuration d'une application Web pour Phalanger passe par le fichier de configuration Web.config.

Le Web.config est un fichier XML qui reprend les directives de configuration classiques du fichier PHP.ini et quelques autres directives ASP.NET ou propres à Phalanger. Ce fichier est relativement simple et facilement éditable.

L'extrait de code ci-dessous est l'exemple du fichier Web.config à joindre par défaut à une application PHP existante pour l'exécuter avec Phalanger.

 
Sélectionnez

<?xml version="1.0"?>
<configuration>
  <system.webServer> 
    <handlers> 
      <add name="Phalanger" path="*.php" verb="*" type="PHP.Core.RequestHandler, PhpNetCore, Version=2.0.0.0, Culture=neutral, 
	   PublicKeyToken=0a8e8c4c76728c71"/> 
    </handlers> 
  </system.webServer>
</configuration>

X. Prise en charge des extensions PHP existantes

Nous avons vu qu'avec Phalanger il est possible d'exécuter des applications web PHP existantes sans aucune modification de code en mode Legacy, cependant plusieurs applications web PHP ont recours à des extensions PHP qui ne font pas partie du langage PHP de base comme pdf, image, domxml, sockets ou encore calendar.

Il est donc nécessaire de pouvoir aussi les utiliser avec Phalanger. C'est pourquoi les concepteurs de Phalanger fournissent un ensemble de wrappers en code managés .NET pour chaque extension. Le wrappers est une bibliothèque qui contient l'interface utilisée par Phalanger pour appeler l'extension.

Après installation de Phalanger, ces wrappers sont déployés automatiquement dans le GAC (Global Assembly Cache).

Pour une installation manuelle dans le GAC, les Warppers des extensions PHP sont disponibles dans un dossier Wapper du dossier où est installé Phalanger.

A titre d'exemple, nous allons dans un code PHP faire appel à une fonction d'une extension PHP existante.

 
Sélectionnez

<php?
  $ca = cal_info(CAL_GREGORIAN) ;
  foreach ($ca[ "month"]  as $m) 
    echo  "$m<br/>" ;
?>

Comme vous pouvez le constater l'utilisation de l'extension dans le code PHP se fait comme avec le langage PHP standard, cependant dans le fichier Web.Config, vous devez inclure une référence à l'extension dans la section classLibrary.

 
Sélectionnez

<? Xml  version = "1.0"  encodage = "utf-8"  ?>
 <configuration >
   <system.web > 
   </system.web >
   <phpNet>
	  <classLibrary>
	     <add  l'assemblage = "php_calendar.mng, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 4ef6ed87c53048a3"  
		 section = "calendar"  />
      </ classLibrary >
   </phpNet>
 </configuration >

XI. Support de Mono

Depuis la version 2.0, Phalanger prend en charge la plate-forme Mono (implémentation open source de la plate-forme .NET sous Linux).

La prise en charge de Mono dans Phalanger permet de nombreux scénarios intéressants. Vous pouvez utiliser Phalanger avec le serveur Web Apache et l'extension mod-mono qui vous permet d'exécuter des applications Web PHP avec Phalanger.

Vous pouvez également, grâce à la prise en charge de Mono, développer des applications PHP (WinForms, ASP.NET) portables sur la plate-forme Mono ainsi qu'utiliser n'importe quelle bibliothèque Mono avec Phalanger pour développer par exemple des applications GUI utilisant la bibliothèque Gtk.

XII. MySQL Managed Extension for Phalanger

MySQL Managed Extension for Phalanger est une extension livrée séparément, basée sur l'extension MySQL de PHP, et disponible sous licence GPL. Il permet d'avoir un gain de performance comparé à l'extension MySQL de PHP.

Image non disponible

XII-A. Installation et utilisation

L'extension est téléchargeable sur le site du projet, le lien est fourni en fin d'article.

Après avoir téléchargé le package d'installation, le désarchiver dans le dossier d'installation de Phalanger et exécuter ensuite le fichier install-mysql.cmd pour ajouter l'assembly dans le GAC.

Pour utiliser l'extension dans un projet Phalanger ou un site web PHP existant sur Phalanger, ajoutez une référence à l'extension dans le fichier Web.config dans la section phpNet/classLibrary.

 
Sélectionnez

<add assembly="PhpNetMySql, Version=2.0.0.0, Culture=neutral, PublicKeyToken=2771987119c16a03" section="mysql"/>

Supprimer la référence à l'extension MySQL natif.

XII-B. Configuration

Vous pouvez configurer directement l'extension dans le fichier Web.config en ajoutant à la suite de la référence à l'extension, dans la balise phpNet, les balises suivantes :

 
Sélectionnez

<!-- Optional configuration -->
    <mysql>
      <!-- Default server for mysql_connect() function. -->
      <set name="Server" value="" phpName="mysql.default_host" />
      <!-- Default port for mysql_connect() function. -->
      <set name="Port" value="3306" phpName="mysql.default_port" />
      <!-- Default user for mysql_connect() function. -->
      <set name="User" value="" phpName="mysql.default_user" />
      <!-- Default password for mysql_connect() function. -->
      <set name="Password" value="" phpName="mysql.default_password" />
      <!-- Connection timeout. Negative value or zero means no timeout. -->
      <set name="ConnectTimeout" value="60" phpName="mysql.connect_timeout" />
      <!-- Limit for the number of simoultaneous connections that the application can establish.Negative value means no limit. -->
      <set name="MaxConnections" value="-1" phpName="mysql.max_links" />
    </mysql>

XIII. Améliorations à venir de Phalanger

Les travaux sont en cours pour la mise sur pied d'une extension pour la prise en charge de Visual Studio 2010, Visual Studio 2010 SP1 ainsi que l'intégration de l'IntelliSense pour PHP.

Des travaux sont également en cours pour la prise en charge de Moonlight (implémentation open source sur l'environnement Linux de Silverlight) et le noyau du projet est en train d'être modifié pour le porter sur le DLR (Dynamique Language Runtine) sur lequel tournent les langages IronPython et IronRuby, implémentations .NET des langages dynamiques Python et Ruby.

XIV. Conclusion

L'implémentation du langage PHP sur la plate-forme .NET permet aux développeurs d'exploiter la richesse et la souplesse de la plate-forme .NET avec un langage dynamique facile qu'est PHP. Le projet Phalanger fait désormais de PHP un langage de la plate-forme .NET à part entière pouvant être utilisé dans plusieurs technologies disponibles sur le .NET framework.

Vous avez découvert tout au long de cet article la prise en charge de PHP sur la plate-forme .NET, comment il est possible de développer des applications ASP.NET, WinForms ou Silverlight en utilisant le langage PHP ou encore exécuter les applications PHP existantes pouvant, de ce fait être intégrées aux différentes technologies Microsoft.

Nous profitons de cette occasion pour saluer les efforts consentis par les développeurs de Phalanger pour mettre sur pied et maintenir ce projet, nous les encourageons à intégrer beaucoup plus de fonctionnalités à celui-ci.

XV. Liens utiles

XVI. Remerciements

Je tiens à remercier ClaudeLELOUP pour sa relecture et correction orthographique.