.NET без ASP.NET или как использовать технологию Microsoft средствами PHP

Долгое время мы ничего не знали о том, что скрывается под странным буквосочетанием NET, о котором Microsoft впервые дала знать в 2001 году. Тем временем концепция уже стала известной: основным компонентом .NET является .NET Framework - мощная библиотека классов, функции которой рассчитаны на все случаи жизни. Программы .NET могут обращаться к библиотеке и пользоваться ее функциями.

Однако здесь просматривается один существенный недостаток. Эта библиотека должна быть установлена у клиента, только тогда программы .NET смогут ей пользоваться. Следовательно для работы NET-Software необходимо установить .NET Framework. К счастью библиотека распространяется бесплатно и доступна через Windows Update (как опциональный компонент).

Что бы не говорили, а технология . NET очень интересна. Даже такие известные и признанные разработчики PHP как Стерлинг Хьюз (Sterling Hughes) считают технологию . NET очень продуманной. Как показывает анализ блогов, выбор того или иного решения основывается не на свойствах конкретной технологии, а на выборе операционной системы. Сейчас . NET имеет большое преимущество, поскольку эта технология работает только на платформе Windows. Правда, существуют проекты типа Mono[1] и dotGNU[2] которые противостоят этому, однако их возможности намного отстают от решения Microsoft.

Если Вы используете Unix/Linux, PHP - отличный выбор. Одно время под Windows можно было установить только (ASP).NET, однако журнал Netcraft-Studie (октябрь 2003) свидетельствует, что PHP для Windows работает удивительно стабильно.

В этой статье мы расскажем как можно сочетать все лучшее, что предлагают две технологии: мы будем программировать на PHP, используя функциональность . .NET. Сразу обратим внимание на одно ограничение: расширение PHP для работы с технологией . NET считается экспериментальным и пока еще содержит несколько багов и неприятных особенностей. Однако Ветц Фурлонг (Wez Furlong), разработчик, будет рад любой помощи.

Для использования .NET-расширения вам понадобиться операционная система Windows с установленной библиотекой .NET Framework. К сожалению, вам не придется изменять php.ini, поскольку в системах Windows .NET-расширение запускается автоматически. Функция phpinfo() даст вам необходимую справку: ищите секцию com_dotnet, в ней должна быть запись .Net enabled.

.NET и PHP

.NET-расширение PHP очень просто в использовании. Вся прелесть заключается в том, что в распоряжении пользователя оказывается только один класс DOTNET. Его конструктор требует, наряду с именем класса , идентификатор Assembly.

Понятие Assembly обозначает в .NET структуру, которая включает ресурсы (например используемые библиотеки), информацию о версиях, пространстве имен, ограничителях ресурсов. Вот простой пример, в котором инициализируется класс System.Random:

<?php
$random 
= new DOTNET('mscorlib''System.Random');
?>

Соответственно mscorlib - это идентификатор Asssembly, а System.Random - имя нужно класса. Полный список идентификаторов Assembly вы можете найти в документации по .NET. (поставляется вместе с .NET Framwork SDK, который к тому же включает версию .NET Framework размером 100 мб с объемной документацией и дополнительными инструментами). Есть другой путь: для ASP.NET существует бесплатный редактор. Он относится к группе программ, называемых IDE, и поэтому содержит такую полезную функцию как ClassBrowser. Там перечислены все классы .NET Framwork, а так же идентификаторы Assembly.

Вернемся к нашим баранам, то есть к программированию. Объект, создаваемый DOTNET() ведет себя как соответствующий .NET класс, методы и свойства которого находятся в вашем распоряжении. Применительно к классу random это означает следующее: метод Next() создает новое (следующее) случайное число. Вот небольшой листинг, где генерируются и выводятся на экран три случайных числа

<?php
$random 
= new DOTNET('mscorlib''System.Random');
$random_numbers[] = $random->Next();
$random_numbers[] = $random->Next();
$random_numbers[] = $random->Next();
echo 
implode(' '$random_numbers);
?>

Об ограничениях и о том, как их можно обойти

Как показывает рисунок два, вы получаете три числа, которые, по большей части, окажутся девяти или десятиразрядными. Это объясняется тем, что Next() возвращает целое положительное 32-битное число типа Integer, т.е. величину от 0 до 2147483647. Задать точный интервал в .NET можно, если методу Next() передать в качестве параметра:

  • верхний предел (в таком случае нижняя граница автоматически определяется как 0)
  • верхний и нижний предел

К сожалению, здесь чувствуются ограничения самого PHP, поскольку последний не поддерживает перегрузку, то есть в том случае, если определены методы с одинаковыми именами, всегда будет вызываться первый. Если вы попытаетесь при вызове метода Next() передать ему один или два параметра, - получите сообщение об ошибке.

 

Поэтому верхний и нижний предел генерируемого случайного числа определить довольно-таки затруднительно. Для этого вы должны провести некоторые преобразования. Но об этом немного позже!

Пока мы приведем другой пример. Технология .NET (класс System.Collections) предоставляет серию полезных компонентов, таких как различные виды массивов и списков: ArrayList, Hashtable, Queue, Stack и другие. Их также можно задействовать . Приведем пример с использованием ArrayList Эта структура представляет собой массив, в который вы можете поместить абсолютно любой элемент. Поскольку все языки .NET типизированы, эта возможность выгодно отличает ArrayList от обычных массивов, которые могут содержать элементы только одного типа. Перечислим важные методы и свойства ArrayList:

  • Метод Add() добавляет элемент в массив
  • Свойство Count содержит информацию о количестве элементов массива
  • Свойства Item возвращает элемент массива, индекс которого указывается в круглых скобках.
  • Sort() сортирует элементы массива

Следующий листинг создает объект класса ArrayList, наполняет массив значениями, сортирует их и выводит через цикл for. Мы задействуем все описанные выше методы и свойства:

<?php
$list 
= new DOTNET('mscorlib''System.Collections.ArrayList');
$list->Add(31);
$list->Add(23);
$list->Add(42);
$list->Sort();
for (
$i 0$i $list->Count$i++) {
echo 
$list->Item($i) . ' ';
}
?>

Практика

После теории идет практика. Приведем один маленький пример, который связывает два представленных выше листинга. Используя технологию .NET, мы сгенерируем случайные числа и поместим их в массив. С помощью класса random мы создадим 6 различных чисел от 1 до 49, отсортируем их и выведем на экран. Самая большая трудность заключается в установлении верхнего предела 49. Вспомним, что метод Next() класса System.Random возвращает значение от 0 до 2147483647. Если разделить полученное число на 2147483648, результатом этой операции будет значение от 0 (включительно) до 1 (не включая). Затем умножим его на 49, в результате получается число от 0 (включительно) до 49 (не включая). Вызов функции intval() поможет привести полученное число к целому типу. В итоге, у нас получется целое число от 0 до 48 (включительно). Прибавим к нему единицу, и тогда у нас получится желаемый результат от 1 до 49. Это относительно сложный путь, однако сколько умственных сил было потрачено! Этот код вы можете взять на заметку.

$random = new DOTNET('mscorlib', 'System.Random');
$random_number = $random->Next();
$random_number = intval(49 * random_number / 2147483648) + 1;

Перед тем, как обновить содержимое массива, вы должны учесть, что он должен содержать разные числа. Необходимую проверку можно выполнить с помощью .NET: класс ArrayList имеет метод Contains(), который действует также как и PHP-функция in_array().

$numbers = new DOTNET('mscorlib', 'System.Collections.ArrayList');
if (!$numbers->Contains($random_number)) {
$numbers->Add($random_number);
}

Дальше все просто. С помощью цикла while мы наполняем массив случайными числами до тех пор, пока свойство Count не будет равно 6. После сортировки (метод Sort), прогоняем массив через цикл и выводим значения на экран (см. листинг 1)

<?php
$numbers 
= new DOTNET('mscorlib''System.Collections.ArrayList');
$random = new DOTNET('mscorlib''System.Random');

while (
$numbers->Count 6) {
$random_number  $random ->Next();
$random_number intval(49 $random_number 2147483648) + 1;
if (!
$numbers->Contains($random_number)) {
$numbers->Add($random_number);
}
}
$numbers->Sort();

for (
$i 0$i $numbers->Count$i++) {
echo 
$numbers->Item($i) . " ";
}
?>

 

PEAR и .NET

К сожалению, в PEAR нет класса подобного тому, что используется в .NET-расширении PHP5. Однако Стерлинг Хьюз написал похожее расширение для PECL, которое работает с OpenSource вариантом .NET - Mono. Вам необходимо установить само приложение Mono, а так же скачать самую последнюю версию Mono-расширения с домашней страницы проекта [6]. Распакуйте tgz-архив в подкаталог с расширениями исходников PHP, затем скомпилируйте PHP снова:

./buildconf
./configure --with-mono

Через некоторое время процесс компиляции завершится, тогда вы можете пользоваться расширением Mono, которое работает так же , как и .NET-расширение PHP. Единственная разница заключается в том, что в конструктор требует в качестве параметра только имя класса. Идентификатор Assembly не нужен.

<?php
$random 
= new Mono('System.Random');
$random_number[] = $random->Next();
$random_number[] = $random->Next();
$random_number [] = $random->Next();
echo 
implode(' '$random_number);
?>

Подробную информацию о расширении Mono, а так же несколько примеров, можно найти на сайте Стерлинга Хьюза [7].

Ограничения

.NET-расширение PHP5 выглядит очень практичным, если вы хотите интегрировать .NET-Business-Logic в приложения PHP. Но, к сожалению, оно еще не закончено. Многие операционные системы не поддерживают .NET-расширение, к тому же выполнение некоторых кодов приведет к странным сообщениям об ошибках, например «недостаточно места», а документация недостаточно объемна. В итоге, мы получаем интересную, но недостаточно совместимую, площадку для экспериментов.

Христиан Венц - автор книг, преподаватель и консультант. Его конек — Web-технологии. В серии статей «x без x» он регулярно рассказывает о скрытых возможностях PHP. Более подробную информацию по теме, вы можете найти в книге «PHP5 Kompendium», которую Христинан написал совместно с Тобиасом Хаузером.




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка