Функции, описанные в этой главе, позволяют создать интерфейс с внешними объектными уровнями. При этом PHP обычно создает экземпляр объекта из другой среды и рассматривает его в качестве естественного объекта. Стандарты COM и CORBA являются двумя конкурирующими стандартами упаковки функциональных блоков, предназначенных для повторного использования, в объекты, которые потом может использовать любой язык программирования. Java - это язык программирования, но для PHP он тоже является другой системой с внешними объектами.
18.1. COM-модель
Модель компонентных объектов (Component object model, COM) представляет собой структуру, которая позволяет разделять исполняемые модули без перекомпиляции. При работе с ОС Windows работа ведется с динамическими библиотеками (Dynamic-link library, DLL), являющимися наборами функций, которые программа может загрузить по необходимости. С DLL-библиотеками может одновременно работать несколько программ. К сожалению, DLL-библиотеки, хорошо совместимые с одними языками программирования, не могут работать с другими. Эту проблему и призвана решить COM-модель. Объекты COM-модели доступны для C++, Visual Basic, PHP и многих других языков программирования.
Конечно, курс обучения COM-модели выходит за рамки этой книги. Список литературы, рекомендованной компанией Microsoft, достаточно длинен, и его можно найти по адресу <http://www.microsoft.com/com/tech/com.asp>. Однако чтение только статей, посвященных этой теме, может потребовать слишком много времени.
Начать знакомство можно с книги GUI's Gentle Guide to COM (<http://www.microsoft.com/com/news/drgui.asp>).
Есть два способа работы с COM-объектами в PHP. В первом случае объект загружается с помощью com_load. После этого методы вызываются с помощью утилиты com_invoke, свойства можно принять и установить с помощью утилит com_propget и com_propset. Этот способ имеет определенные ограничения. Второй способ заключается в том, что объекты инициализируются с помощью new COM. После этого объект считается аналогичным любому другому PHP-объекту. Зеев Сураски (Zeev Suraski) добавил в PHP поддержку COM.
object COM::COM(string module, string server, integer code_page)
Для создания COM-объекта в сценарии используется COM-класс (листинг 18.1). Этот конструктор для работы требует только имя COM-модуля, который использует идентификатор программы. Существует вариант загрузки удаленного объекта по адресу COM-модуля в Internet с указанием необязательного аргумента server. В таком случае необходимо активизировать DCOM в php.ini . При этом необязательный аргумент code_page может иметь одно из следующих значений: CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP,CPJJTF7 или CPJJTF8.

ЛИСТИНГ 18.1. Функция COM::COM

<?php
//создать объект ADO
$adodb = new OOM("ADODB.Connection"); //подключиться к файлу MS Access $adodb->Open("PROVIDER=MSDASQL; " .
"DRIVER={Microsoft Access Driver (*.mdb)};
"DBQ=C:Program FilesMicrosoft Office" .
"OfficeSamplesinventry.mdb"); //выполнить запрос $recordset = $adodb->Execute(
"SELECT * FROM [Household Inventory]"); //определить количество столбцов $columns = $recordset->Fields->Count(); //распечатать заголовки таблиц print('<table border="1"><tr>'); for($c=0; $c < $columns; $c++)
{
$f = $recordset->Fields($c); print("<th>$f->Name</th>");
}
print("</tr>n"); //распечатать каждую строку while(!$recordset->EOF)
{
print("<tr>");
for($c=0; $c < $columns; $c++)
{

$f = $recordset->Fields($c);
print("<td>$f->Value</td>");
}
print("n");
$recordset->MoveNext(); print("</tr>n");
}
print("</table>n"); 
// очистка
$recordset->Close(); $adodb->Close(); $recordset->Release(); $adodb->Release(); $recordset = null; $adodb = null;
?>

integer com_addref(object com)
Функция comJaddref увеличивает счетчик ссылок на единицу и возвращает новый счетчик.
boolean com_event_sink(object com, object sink_object, string interface)
Функция com_event_sink (листинг 18.2) соединяет события COM с объектом обработки PHP. Необязательный аргумент interface устанавливает используемый интерфейс.

I Листинг 18.2. Функции com_event_sink И com_message_pump
<?php
class MSIEjEventHandler
{
var $quit = FALSE;
function NavigateComplete2($d, $url)
{
print(date("H:i:s") .
" NavigateComplete2 $urln");
}
function OnQuit()
{
$this->quit = TRUE;
}
}
//это должно работать всегда
setJtimeJlimit(0);
//открыть MS Internet Explorer
$msie = new COMC'internetexplorer.application"); //создать новую программу обработки $sink = new MSIEJEventHandler(); //register sink
com_event_sink($msie, $sink, "DWebBrowserEvents2"); // отобразить браузер $msie->Visible = true; while(!$sink->quit)
{
//выдавать по одному сообщению в секунду comJmessageJpump(1000);
}
$msie = null;
?> 
value com_get(resource com, string property)
Функция comJget возвращает свойства объекта COM.