扩展COM类?

时间:2014-02-07 22:56:08

标签: php

您好我在PHP项目中使用Debenu Quick PDF Library。 我使用以下代码实例化我的对象。

$qp = new COM('DebenuPDFLibraryAX1012.PDFLibrary');

我的问题:是否可以扩展此COM类?

2 个答案:

答案 0 :(得分:1)

是的,除非声明为final,否则可以扩展任何类。但是,如果已使用final关键字声明各个方法,则您可能无法覆盖某些方法。

答案 1 :(得分:0)

扩展 COM 类 - 在覆盖某些函数并期望基类代码调用覆盖版本的意义上 - 通常是不可能的,无论您使用何种语言。

原因很简单:尽管 COM 接口类似于 C++ 对象的虚拟指针表 - 后者在某些上下文中可用作前者 - 它们实际上是单向的。它们允许您调用对象,但对象不一定使用它们来调用它自己的方法,并且 COM 不允许您将新的函数指针粘贴在某处。

事实上,除非您使用的接口是针对在同一单元中创建的进程内对象,否则接口方法的调用不会直接进入该对象。相反,它们转到由 COM 创建的 proxy object,它将调用转发到真实对象的单元(可能在另一个进程中,甚至在另一台计算机上)中的 stub object,后者将依次调用真实对象上的方法并将结果沿链传回。

当您覆盖基类的函数时,您通常会期望基类代码会回调到您的派生类中。在 COM 中,调用某些东西需要获取一个接口指针并调用它的一些方法。但是,您的派生类不会向 COM 公开基类知道并要求的任何接口。

这就是为什么可扩展的 COM 类必须发布接口 - 基本上是钩子 - 用户可以实现这些接口以便在适当的时候被回调。这些通常被称为“事件接口”,而 COM 类则被称为“发布事件”,“OnClick”就是一个著名的例子。