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, es posible usar la sentencia foreach 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.
Example#1 For Each en ASP
<% Set objetoDominio = GetObject("WinNT://Domain") For Each obj in objetoDominio Response.Write obj.Name & "<br />" Next %>
Example#2 while() ... Next() en PHP 4
<?php
$objetoDominio = new COM("WinNT://Domain");
while ($obj = $objetoDominio->Next()) {
echo $obj->Name . "<br />";
}
?>
Example#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 esta técnica.
Iterar a través de SafeArrays ("verdaderas" matrices) usando la estructura de control foreach. 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 COM 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 este 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.
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. |
A continuación se presenta una corta explicación de las directivas de configuración.
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.
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.
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.
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.
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.
Note: Esta directiva de configuración se incluyó en la versión de PHP 5.
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.
Esta extensión define una referencia a un componente COM devuelto por la obsoleta com_load() (esta función no existe en PHP 5; use la clase COM en su lugar).
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.
Para más información sobre COM, lea la » especificación COM o quizás eche un vistazo a la » Otra Biblioteca COM Más (YACL por sus siglas en inglés) de Don Box. Puede encontrar información adicional en nuestro FAQ sobre PHP y COM. Si está pensando en usar aplicaciones MS Office en el lado del servidor, es buena idea que lea la información encontrada aquí: » Consideraciones para la Automatización de Office en el Lado del Servidor.