它是DCE RPC(开放标准)之上的面向对象的层(和相关服务),并定义了通用的调用约定,该约定使使用任何语言编写的代码可以调用并与使用任何其他语言编写的代码进行互操作。这些代码不仅可以用任何语言编写,甚至不需要成为同一可执行文件的一部分。可以从DLL加载代码,在同一计算机上运行的另一个进程中找到代码,或者使用DCOM(分布式COM)在远程计算机上的另一个进程中找到代码,而无需知道代码,甚至不需要知道组件的位置居住。使用COM,您可以启动Microsoft Word,填写文档模板,然后将结果另存为Word文档,并将其发送给您的网站的访问者。您还可以使用COM来执行网络的管理任务和配置IIS。
安装
开启扩展:ini中添加 extension = php_com_dotnet.dll
配置
//如果打开此选项,PHP 将被允许以一个 D-COM(Distributed COM)客户方式操作并允许 PHP 脚本在远程服务器上实例化 COM 对象。
com.allow_dcom
//启用此选项后,PHP将尝试从其实例化的COM对象的类型库中注册常量,如果这些对象实现了获取该信息所需的接口。它所注册常数的大小写敏感度由 配置指令。
com.autoregister_typelib
//启用此选项后,将使用PHP错误机制报告在对象实例化期间加载类型库的任何问题。缺省值为off,如果发现或加载类型库出错,则不会发出任何指示
com.autoregister_verbose
com类
com类允许您实例化与OLE兼容的COM对象,并调用其方法并访问其属性。返回的对象是一个重载对象,这意味着PHP不像常规类那样看到任何固定方法。而是将任何属性或方法访问都传递给COM。PHP将自动检测通过引用接受参数的方法,并将自动将常规PHP变量转换为可以通过引用传递的形式。这意味着您可以非常自然地调用该方法。您无需在代码中付出任何额外的努力。
//构造一个新的com对象
com::__construct(string $module_name , array|string|null $server_name = null , int $codepage = CP_ACP , string $typelib = "")
module_name 可以是ProgID,类ID或Moniker,用于命名要加载的组件。 ProgID通常是应用程序或DLL名称,后跟一个句点,然后是对象名。例如:Word.Application。 类ID是唯一标识给定类的UUID。 Moniker是一种特殊的命名形式,在概念上类似于URL方案,它标识资源并指定应如何加载资源。例如,您可以通过指定单词文档的完整路径作为模块名称来加载Word并获取一个代表单词文档的对象,或者可以将其LDAP:用作别名,以使用LDAP的ADSI接口。
server_name 应在其上加载和运行组件的DCOM服务器的名称。如果为null,则使用应用程序的默认值运行对象。默认值通常是在本地计算机上运行,尽管管理员可能已将应用程序配置为在其他计算机上启动。 如果您null为服务器指定了非值,PHP将拒绝加载该对象,除非配置选项设置为true。如果server_name是数组,则它应包含以下元素(区分大小写!)。请注意,它们都是可选的(尽管您需要同时指定用户名和密码);如果省略“服务器”设置,则将使用默认服务器(如上所述),并且对象的实例化将不受 指示。
Server 服务器的名称
Username 连接的用户名
Password 密码
Domain server的域名
Flags 一个或多个以下常量,逻辑或运算在一起的: CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER, CLSCTX_SERVER和 CLSCTX_ALL。如果未指定,则默认值是CLSCTX_SERVER如果您也省略了Server,或者 CLSCTX_REMOTE_SERVER您确实指定了服务器。您应该查阅CoCreateInstance的Microsoft文档,以获取有关这些常量的含义的更多信息。您通常不必使用它们。
codepage 指定用于将字符串转换为unicode-string以及反之亦然的代码页。每当将PHP字符串作为参数传递或从此COM对象的方法返回时,都会应用该转换。代码页是粘性的,这意味着它将传播到对象以及从对象返回的变体。 可能的值是 CP_ACP(使用系统默认ANSI代码页-缺省如果省略该参数), , CP_MACCP, CP_OEMCP,CP_SYMBOL( CP_THREAD_ACP使用代码页/区域设置为当前执行的线程中设置),CP_UTF7 和CP_UTF8。您也可以在给定的代码页中使用该号码;有关代码页及其数值的更多详细信息,请查阅Microsoft文档。
variant类
VARIANT与COM等同于PHP zval;它是一个结构,可以包含具有不同可能类型范围的值。COM扩展提供的变体类使您可以更好地控制PHP向COM传递值和从COM传递值的方式。
//构造一个新的变量对象
variant::__construct(mixed $value = null , int $type = VT_EMPTY , int $codepage = CP_ACP)
value 初始值。如果省略,或设置为null,将创建一个VT_EMPTY对象。
type 指定变量对象的内容类型。取值为VT_XXX常量之一。PHP可以自动检测通过引用传递的参数;它们甚至不需要作为变量对象传递。有关变体类型的额外信息,请参阅MSDN库
codepage 指定用于将字符串转换为unicode的代码页,有关更多信息,请参见com类中的同名参数
COMPersistHelper类
COMPersistHelper改进了COM 和PHP的互操作性
创建对象
//构造一个持久性帮助器对象,通常与variant关联
COMPersistHelper::__construct(variant|null $variant = null)
variant 一个实现IDispatch的COM对象。为了能够成功调用COMPersistHelper的任何方法,该对象必须实现IPersistFile,IPersistStream 和/或IPersistStreamInit。 仅当通过调用COMPersistHelper::LoadFromStream()从流中加载对象时, svariant传递null才有用
获取信息
//检索与对象关联的文件的当前名称
COMPersistHelper::GetCurFileName():string|false
//检索保存对象所需的流大小(以字节为单位)
COMPersistHelper::GetMaxStreamSize():int
初始化对象
//将对象初始化为默认状态
COMPersistHelper::InitNew():bool
打开文件
//打开指定的文件,并从文件内容中初始化一个对象。
COMPersistHelper::LoadFromFile(string $filename , int $flags = 0):bool
filename 从中加载对象的文件的名称
flags 打开文件时要使用的访问模式,如果flags为0,则实现应使用用户打开文件时使用的任何默认权限打开文件
保存文件
//从先前保存对象的流中初始化一个对象
COMPersistHelper::LoadFromStream(resource $stream):bool
//将对象保存到指定的流
COMPersistHelper::SaveToStream(resource $stream):bool
//将对象的副本保存到指定的文件
COMPersistHelper::SaveToFile(string|null $filename , bool $remember = true):bool
filename 将对象保存到的文件的名称
remember 指示是否将该filename参数用作当前工作文件。如果true,filename成为当前文件和对象应该保存后清除其脏标志。如果为false,则此保存操作是“将副本另存为...”操作。在这种情况下,当前文件将保持不变,并且该对象不应清除其脏标志。