Nie, nie pomyliłem się. Kompilator PHP do kodu maszynowego istnieje i ma się całkiem dobrze. Mowa oczywiście o Phalanger, open-source’owym projekcie, pozwalającym korzystać z PHP tak samo, jak korzysta się z na przykład C#. Na projekt natrafiłem przy okazji (którą opiszę nieco później) i muszę przyznać, iż wygląda on bardzo interesująco. W skrócie – Phalanger kompiluje kod PHP do postaci MSIL, używanego przez środowisko CLR, dzięki czemu w banalny wręcz sposób możemy tworzyć “mieszane” aplikacje PHP + .NET.
Według informacji znajdujących się na stronie projektu, Phalanger posiada następujące możliwości:
- korzystanie z bibliotek stworzonych w PHP przez inne języki platformy .NET
- możliwość korzystania z bibliotek platformy .NET w kodzie PHP
- kompilowanie PHP, a co za tym idzie zwiększenie jego wydajności
- dodanie PHP do Visual Studio jako jednego z wielu dostępnych języków, a co za tym idzie możliwość korzystania z podpowiadania składni oraz debugowania aplikacji
Tyle teorii, a jak to wygląda w praktyce? Poniżej znajduje się przykład zaczerpnięty bezpośrednio z Phalangera. Jest to typowa strona aspx.
<%@ Page Language="PHP" AutoEventWireup="false" CodeFile="Default.aspx.php" Inherits="_Default" Title="Secret page" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Secret page</title>
</head>
<body style="font-family: Arial, Helvetica, sans-serif">
<form id="form1" runat="server">
<center>
<table border="0" cellpadding="0" cellspacing="5">
<tr>
<td style="text-align: center">
You are currently logged in as <b><%= HttpContext::$Current->User->Identity->Name %></b>.
</td>
</tr>
<tr>
<td>
This page is protected by
<a href="http://msdn.microsoft.com/library/en-us/dnpag2/html/PAGExplained0002.asp?frame=true">Forms Authentication</a>.
</td>
</tr>
<tr>
<td style="text-align: center">
<asp:Button ID="ButtonLogout" runat="server" Text="Logout" OnClick="ButtonLogout_Click" />
</td>
</tr>
</table>
</center>
</form>
</body>
</html>
A teraz najzwyklejszy kod PHP (z małym dodatkiem), pełniący rolę code behind dla powyższej strony aspx.
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 _Default extends System:::Web:::UI:::Page
{
protected function ButtonLogout_Click($sender, $e)
{
FormsAuthentication::SignOut();
FormsAuthentication::RedirectToLoginPage();
}
}
Jak widać pojawiło się importowanie przestrzeni nazw ze środowiska .NET, nowy operator (:::) oraz klasa częściowa. Nie są to jedyne zmiany, jakie wprowadzone zostały do PHP.
Niestety nie udało mi się uruchomić Phalangera na Visual Studio Express, co za tym idzie nie jestem w stanie w chwili obecnej potwierdzić, czy i jak to działa w rzeczywistości. Jeśli faktycznie można przy pomocy PHP tworzyć aplikacje bezproblemowo “gadające” z dotnetem, wówczas przed PHP otwiera się zupełnie nowy świat.
W każdej beczce miodu musi znaleźć się łyżka dziegciu. Nie inaczej jest w przypadku Phalangera. Na pewno zauważyliście nowy operator (:::). Zdaję sobie sprawę, iż wszystkie inne operatory są już zajęte, ale jakoś dziwnie te trzy dwukropki wyglądają. Bardziej niepokojąco wygląda sprawa z zarezerwowanym słowem namespace. Wprawdzie nie uruchamiamy języka w interpreterze PHP, niemniej korzystanie z zarezerwowanych terminów może spowodować problemy podczas kompilacji aplikacji napisanej w PHP 5.3. Nie dane mi było przetestować jak wygląda kwestia korzystania z Phalangera w Visual Studio, więc nie wiem jak wygląda podpowiadanie składni oraz debuger.
Zainteresowanych Phalangerem odsyłam do strony projektu – http://www.php-compiler.net/
Z kolei na codeplex znajdziecie dokumentację, linki do pobrania projektu oraz do wiki – http://phalanger.codeplex.com/.