COM es un acrónimo para Component Object Model (Modelo de
Objetos por Componentes); es una capa orientada a objetos (asi
como servicios asociados) que cubre la especificación DCE
RPC (un estándar abierto) y define una convención
común de llamado que permite que código escrito en
cualquier lenguaje pueda llamar e inter-operar con código
escrito en cualquier otro lenguaje (provisto que ambos lenguajes
hagan uso de COM). No solo es posible escribir el código
en cualquier lenguaje, también es cierto que no necesita
ser parte del mismo ejecutable; el código puede ser
cargado desde un recurso DLL, encontrarse en otro proceso
corriendo en la misma máquina, o, mediante DCOM (COM
Distribuido), encontrarse en otro proceso en una máquina
remota, todo esto sin requerir que su código sepa siquiera
en dónde reside el componente.
Existe un sub-conjunto de COM conocido como Automatización
OLE que se compone de un grupo de interfaces OLE que permiten los
enlaces flexibles con objetos COM, de modo que puedan ser
susceptibles a introspección y llamados en tiempo de
ejecución sin conocimientos en tiempo de
compilación sobre el modo de operación del
objeto. La extensión COM de PHP utiliza las interfaces de
Automatización OLE para permitirle crear y llamar objetos
compatibles desde sus scripts. Técnicamente hablando,
ésta deberÃa ser llamada la "Extensión de
Automatización OLE para PHP", ya que no todos los objetos
COM son compatibles con OLE.
Ahora bien, ¿porqué querrÃa o deberÃa
usar COM? COM es una de las formas principales de unir
aplicaciones y componentes en la plataforma Windows; mediante el
usa de COM usted puede iniciar Microsoft Word, llenar una
plantilla de documento y guardar el resultado como un documento
Word y enviarlo a un visitante de su sitio web. También
puede usar COM para realizar tareas administrativas para su red y
para configurar su servidor web (IIS); tales son apenas los usos
más comunes; usted puede hacer mucho más con COM.
A partir de PHP 5, esta extensión (y su
documentación) fue re-escrita por completo y se ha
eliminado gran parte del material confuso e
inútil. Adicionalmente, se ofrece soporte para la
creación de instancias y ensambles .Net usando la capa de
interoperabilidad COM ofrecida por Microsoft.
Por favor lea este
artÃculo para una vista general de los cambios en
ésta extensión en PHP 5.
Las funciones COM se encuentran disponibles únicamente
para la versión Windows de PHP.
El soporte para .Net requiere PHP 5 y el entorno de desarrollo
.Net.
No se necesita ninguna instalación
para usar estas funciones, son parte del núcleo de
PHP.
La versión para Windows de
PHP tiene soporte nativo para esta
extensión. No se necesita cargar ninguna extensión
adicional para usar estas funciones.
Usted es responsable de la instalación del soporte para
los varios objetos COM que piensa usar (tales como MS Word);
nosotros no incluimos todos éstos con PHP, ni podemos
hacerlo.
A partir de PHP 5, usted puede usar la sentencia la sección de nombre foreach en CapÃtulo 16 de PHP para iterar sobre
los contenidos de un IEnumVariant COM/OLE estándar. En
términos más simples, esto quiere decir que puede
usar foreach en aquellas situaciones en donde podrÃa haber
usado For Each en código VB/ASP.
Ejemplo 1. For Each en ASP <%
Set objetoDominio = GetObject("WinNT://Domain")
For Each obj in objetoDominio
Response.Write obj.Name & "<br />"
Next
%> |
|
Ejemplo 2. while() ... Next() en PHP 4
<?php $objetoDominio = new COM("WinNT://Domain"); while ($obj = $objetoDominio->Next()) { echo $obj->Name . "<br />"; } ?>
|
|
Ejemplo 3. foreach en PHP 5
<?php $objetoDominio = new COM("WinNT://Domain"); foreach ($objetoDominio as $obj) { echo $obj->Name . "<br />"; } ?>
|
|
Muchos objetos COM exponen sus propiedades como matrices, o
usando un acceso estilo-matriz. En PHP 4, es posible usar la
sintaxis de matrices de PHP para leer/escribir tales propiedades,
pero sólo es posible manipular una dimensión. Si
desea leer una propiedad multi-dimensional, puede crear el acceso
en forma de un llamado de función, en donde cada
parámetro representa cada parámetro del acceso a la
matriz, aunque no hay forma de escribir tal tipo de propiedad.
PHP 5 introduce las siguientes caracterÃsticas nuevas para
facilitar su vida:
Acceso a matrices multi-dimensionales, o propiedades COM que
requieren múltiples parámetros usando la
sintaxis de matrices de PHP. También puede escribir o
definir propiedades usando ésta técnica.
Iterar a través de SafeArrays ("verdaderas" matrices)
usando la estructura de control la sección de nombre foreach en CapÃtulo 16. Esto funciona ya que
los SafeArrays incluyen información sobre su
tamaño. Si una propiedad estilo-matriz implementa
IEnumVariant, entonces también puede usar foreach para
tales propiedades; eche un vistazo a la sección de nombre For Each para más información
sobre este tema.
Esta extensión arroja instancias de la clase
com_exception siempre que se presente un error
potencialmente fatal reportado por COM. Todas las excepciones COM
tienen una propiedad code bien definida que
corresponde con el valor de retorno HRESULT proveniente de las
varias operaciones COM. Es posible usar éste código
para tomar decisiones programáticas sobre cómo
manejar la excepción.
El comportamiento de estas
funciones está afectado por los valores definidos en
php.ini.
Tabla 1. Opciones de configuración de COM
| Nombre | Valor por defecto | Donde se cambia | Registro de cambios |
|---|
| com.allow_dcom | "0" | PHP_INI_SYSTEM | Disponible desde PHP 4.0.5. |
| com.autoregister_typelib | "0" | PHP_INI_ALL | PHP_INI_SYSTEM en PHP 4. Disponible desde PHP 4.1.0. |
| com.autoregister_verbose | "0" | PHP_INI_ALL | PHP_INI_SYSTEM en PHP 4. Disponible desde PHP 4.1.0. |
| com.autoregister_casesensitive | "1" | PHP_INI_ALL | PHP_INI_SYSTEM en PHP 4. Disponible desde PHP 4.1.0. |
| com.code_page | "" | PHP_INI_ALL | Disponible desde PHP 5.0.0. |
| com.typelib_file | "" | PHP_INI_SYSTEM | Disponible desde PHP 4.0.5. |
For further details and definitions of the
PHP_INI_* constants, see the
Apéndice H.
A continuación se
presenta una corta explicación de las directivas de
configuración.
- com.allow_dcom
Cuando se encuentra activada, PHP puede operar como un cliente D-COM (COM Distribuido) y por
tanto, los script de PHP pueden instanciar objetos COM en un servidor remoto.
- com.autoregister_typelib
Cuando se encuentra activada, PHP intenta registrar constantes de la librerÃa de tipos
de objetos que instancia (siempre que los objetos implementen las interfaces necesarias
para obtener esa información). La posibilidad de distinguir entre mayúsculas
y minúsculas en los nombres de las constantes se controla con la directiva de
configuración
com.autoregister_casesensitive
.
- com.autoregister_verbose
Cuando se encuentra activada, los problemas que se produzcan al cargar una librerÃa de tipos durante
la instanciación de objetos, se reportarán empleando el mecanismo de errores de PHP. Por defecto
se encuentra desactivado y por tanto no se informa de los posibles errores producidos.
- com.autoregister_casesensitive
Cuando se encuentra activada (y por defecto lo está), las constantes encontradas en las
librerÃas de tipos cargadas de forma automática, se registrarán distinguiendo
mayúsculas y minúsculas. Vea com_load_typelib() para más detalles.
- com.code_page
Controla el código de página del juego de carcateres empleados para la transmisión de
cadenas desde y hacia los objetos COM. Si no se le indica ningún valor, PHP asume que se emplea
el código CP_ACP, que es el valor del código de página
de ANSI.
Si el texto de los scripts está codificado con una codificación o juego de caracteres
diferente al de por defecto, esta directiva permite evitar tener que pasar el código de
página como parámetro del constructor de clase COM.
Se debe tener en cuenta que el uso de esta directiva (al igual que cualquier otra directiva de configuración
de PHP) hace que los scripts de PHP sean menos portables, por lo que se deberÃa emplear lo menos posible.
Nota:
Esta directiva de configuración se incluyó en la versión de PHP 5.
- com.typelib_file
Cuando se encuentra activada, se interpreta como la ruta a un archivo que contiene una lista de librerÃas de
tipos que se deberÃan cargar al inicio. Cada lÃnea se interpreta como el nombre de la librerÃa y
se carga de la misma forma que si se hubiera invocado a la función com_load_typelib().
La constantes se registran de forma persistente, por lo que la librerà solamente debe cargarse una vez. Si el
nombre de la librerÃa finaliza con #cis o #case_insensitive, las constantes de
la librerÃa se cargan sin distinguir entre mayúsculas y minúsculas.
Estas constantes están
definidas por esta extensión y estarán disponibles
solamente cuando la extensión ha sido o bien compilada dentro
de PHP o grabada dinámicamente en tiempo de ejecución.