Класс COM

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

Description

Класс COM позволяет создавать совместимые с OLE объекты COM, вызывать их методы и получать доступ к их свойствам.

$obj = new COM("Application.ID")

Methods

COM::__construct ( string $module_name [, mixed $server_name [, int $codepage [, string $typelib ]]] )

Конструктор класса COM. Параметры имеет следующие назначения:

module_name
Может быть ProgID, Class ID или Moniker указывающий компонент для загрузки. ProgID - это обычно имя приложения или DLL, после которого, через точку, задано имя объекта. Например: Word.Application. Class ID - это UUID, который уникально идентифицирует заданный класс. Moniker - это специальная форма именования, похожая на концепцию URL, определяющая ресурс и способ его загрузки. К примеру, вы можете загрузить Word и взять объект, представляющий документ Word, указав полный путь в качестве имени модуля, или вы можете использовать LDAP: для использования интерфейса ADSI к LDAP.
server_name
Имя сервера DCOM на котором должен быть загружен и выполнен компонент. Если установлено как NULL, будет использоваться значение приложения по умолчанию. Обычно значение по умолчанию означает локальный хост, но в принципе, администратор может задать запуск по умолчанию на другом сервере. Если задано значение отличное от NULL, PHP откажется загружать объект пока не будет разрешена опция конфигурации .

Если server_name задан массивом, то он должен содержать следующие элементы (регистрозависимые!). Обратите внимание, что все эти опции необязательны (ну кроме того случая, что имя и пароль друг без друга не имеют смысла). Если вы опустите строку Server, то будет использован сервер по умолчанию и создаваемый объект не будет обращать внимание на директиву .

Имя сервера DCOM
server_name key тип описание
Server string Имя сервера.
Username string Имя пользователя.
Password string Пароль для Username.
Flags integer Одна или несколько констант объедененных побитовым ИМИ: CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER, CLSCTX_SERVER и CLSCTX_ALL. Значение по умолчанию равно CLSCTX_SERVER если вы также пропустили Server, или CLSCTX_REMOTE_SERVER если не пропустили. Описание значения данных констант читайте в документации Microsoft по CoCreateInstance. Скорее всего вам никогда не понадобится использовать это.

codepage
Задает кодировку используемую для преобразования строк в Unicode и обратно. Преобразование производится при передаче строки PHP как параметра в объект COM и при получении из него результата. Возможные значения: CP_ACP (использовать системную кодировку ANSI по умолчанию - будет использоваться по умолчанию, если параметр опущен), CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP (использовать кодировку/локаль запущенного потока выполенения), CP_UTF7 и CP_UTF8. Также вы можете использовать номер кодировки. Более подробно кодировки и их числовые значения описаны в документации Microsoft.

Перегруженные методы

Возвращаемые объекты являются перегруженными, тоесть PHP не видит каких либо фиксированных методов, как это происходит с обычными классами. Вместо этого свойства и доступ к методам передается через COM.

Начиная с PHP 5, PHP автоматически определяет методы, которые обращаются к свойствам по ссылкам и автоматически преобразуют стандартные переменные PHP в вид, который можно передавать по ссылке. Это означает, чт о вы можете вызывать методы не внося каких либо дополнений в свой код.

Псевдо методы

В PHP до версии 5, для обработки следующих методов средствами PHP без передачи в COM применялся ряд довольно некрасивых хаков. В PHP 5 это поведение исправлено. Ниже описано, как следует изменить ваши скрипты. Эти магические методы регистронезависимы.

void COM::AddRef ( void )

Искуственно добавляет подсчет ссылок в объект COM.

Внимание

Вам никогда не понадобится использовать этот метод. Он логически связан с методом Release(), описанным ниже.

void COM::Release ( void )

Искуственно добавляет подсчет ссылок в объект COM.

Внимание

Вам никогда не понадобится использовать этот метод. Он присутствует в PHP в качестве искуственного бага, служащего для обхода другого бага, из-за которого объект COM существовал дольше, чем должен бы.

Псевдо методы для итерирования

Эти методы доступны только если функция com_isenum() возвращает TRUE, в этом случае они скрывают любые методы с такими же именами, присутствубщие в объекте COM. Эти методы удалены в PHP 5, используйте вместо них For Each.

variant COM::All ( void )

Возвращает вариант представляющий SafeArray имеющий 10 элементов; Каждый элемент будет пустым(NULL) вариантом. Эта функция должна была вернуть массив состоящий из всех элементов итератора, но так и не была дописана. Не используйте ее.

variant COM::Next ( void )

Возвращает вариант представляющий следующий элемент итератора, или FALSE, если элементов не осталось.

variant COM::Prev ( void )

Возвращает вариант представляющий предыдущий элемент итератора, или FALSE, если элементов не осталось.

void COM::Reset ( void )

Перематывает итератор на первый элемент.

Примеры COM

Пример #1 Первый пример

<?php
// запускаем word
$word = new COM("word.application") or die("Unable to instantiate Word");
echo 
"Loaded Word, version {$word->Version}\n";

//делаем его активным окном
$word->Visible 1;

//открываем пустой документ
$word->Documents->Add();

//Что то с ним делаем
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");

//закрываем word
$word->Quit();

//высвобождаем ресурсы объекта
$word null;
?>

Пример #2 Второй пример

<?php

$conn 
= new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password"
);

$rs $conn->Execute("SELECT * FROM sometable");    // Набор записей

$num_columns $rs->Fields->Count();
echo 
$num_columns "\n";

for (
$i=0$i $num_columns$i++) {
    
$fld[$i] = $rs->Fields($i);
}

$rowcount 0;
while (!
$rs->EOF) {
    for (
$i=0$i $num_columns$i++) {
        echo 
$fld[$i]->value "\t";
    }
    echo 
"\n";
    
$rowcount++;            // увеличиваем счетчик строк
    
$rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs null;
$conn null;

?>