Pull to refresh

Знакомство с Phalanger (часть 1, вступительная)

Прелагаю вашему вниманию цикл статей, посвященный проекту Phalanger. Думаю, данный цикл будет интересен как PHP-разработчикам, желающим окунуться в мир .NET, так и .NET-разработчикам, по какой-либо причине имеющим дело с php-скриптами.

Что это?


Phalanger — это open-source проект компилятора PHP для .NET (вот незадача, в каком блоге размещать?).
Phalanger позволяет:
  • запускать имеющийся php-код без существенных изменений и при этом использовать всю мощь библиотек .NET;
  • писать .NET приложения, компилирующиеся в обычные .net-сборки, позволяя вам использовать преимущества компилируемых языков для вашего любимого PHP.

Краткая история


Проект Phalanger ведет свою историю с 2003 года (тогда он назывался PHP.NET). Группа студентов физико-математического факультета Карлова университета в рамках курсовой работы решила выяснить возможность компилирования динамически типизированного языка, такого как PHP, в среде .NET, а также возможность дальнейшей оптимизации работы. Об этом проекте я узнал около 4 лет назад, и тогда я воспринимал его именно как студенческую шалость :) Тем более, что на какое-то время после выпуска версии 1.0, работы по проекту были очень вялыми (а то и вообще не велись). Но, сейчас Phalanger имеет версию 2.1, сайт обзавелся новым дизайном, и работа, судя по всему, кипит. И это радует.
Что же предлагает нам версия 2.1?

Кратко о возможностях


Итак, как я уже говорил выше, Phalanger позволяет не просто запускать готовое php-приложение, но и использовать библиотеки .NET в php-скриптах с минимальными доработками исходного кода. Как это возможно? В реализацию PHP в Phalanger добавлены некоторые возможности, которые отсутствуют в «оригинальном» PHP, например, импорт пространств имён. Вот как выглядит использование очень удобного класса WebClient:
<?php
	import namespace System;
	import namespace System:::Net;
	
	function download($path, $name)
	{
		$client = new WebClient;
		$client->DownloadFile(new Uri($path), $name);
	}
	
	download("http://www.php-compiler.net", "d:\\test.html");
?>

В этом примере содержимое главной страницы ресурса php-compiler.net выгружается в html-файл на диске d:.

Также в синтаксисе PHP можно использовать частичные классы:
<?
    import namespace WinForms;
    namespace WinForms {
        partial class Form1 {
            function foo(){}
        }

и даже… LINQ(!):
$x =
from $numbers as $n
where $n > 50
select $n


Кроме того, PHP может использоваться как язык построения .NET-приложений (консольных, WinForms, ASP.NET). Вот, например, как выглядит простая ASP.NET страница:
Default.aspx
<%@ Page Language="PHP" AutoEventWireup="false" CodeFile="Default.aspx.php" Inherits="_Default" Title="Click" %>

<!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>Click</title>
</head>
<body>
	<form id="form1" runat="server">
		<div>
			<asp:Literal runat="server" ID="ClickResult"></asp:Literal>
			<asp:Button ID="Button1" runat="server" Text="Click me" OnClick="Button1_Click" />
		</div>
	</form>
</body>
</html>

Default.aspx.php
<?
	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 Button1_Click($sender, $e)
		{
			$this->ClickResult->Text = "You clicked me!";
		}		
	}
?>


Стало интересно? :) Тогда в следующей части скачаем, установим, настроим Phalanger; начнём дорабатывать php-скрипты и писать .NET-приложения на PHP!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.