15

我正在为个人项目创建一个 PHP 扩展。除了上面文章中的链接之外,我对 zend_engine 没有任何了解,而且我的 C 技能已经过时了 10 年,而且只是学术性的。所有这些都是在说“如果看起来我在问一个愚蠢的问题,我可能是”。

是否可以在我自己的扩展中调用其他 PHP 扩展中的函数,或者每个 PHP 扩展都被视为一个孤岛,对系统的其他部分没有洞察力?如果这是可能的,这是常见的做法,还是一个坏主意™?

也就是说,我知道我可以返回一个类似这样的字符串。

PHP_FUNCTION(hello_world)
{
    char *str;
    str = estrdup("Hello World");
    RETURN_STRING(str, 0);
}

我希望能够返回一个 SimpleXML 元素或一个 DomDocument 元素。谷歌搜索已被证明是困难的,因为没有大量关于扩展开发的内容,而且有大量关于标准 PHP 使用的内容。

4

3 回答 3

4

是的,扩展实际上可以依赖于其他。他们能:

  • 使用其他扩展全局注册的资源,例如类类型或 PHP 函数(也就是说,它们的访问权限不低于用户级脚本,后者显然可以使用这些资源)。见zend_call_functionzend_lookup_class_ex
  • 使用在文件中声明的任何导出符号和结构php_extensionname.h(这些标头是唯一被视为将本机 API 导出到其他扩展的标头)。但是,某些扩展实际上可能不会导出这些头文件中声明的某些符号,您必须查找使用PHPAPI. 请注意,某些扩展无法停用,您可以依赖它们存在(例如,从 5.3/5.4 开始,标准、SPL、反射、日期、pcre、ereg)。
  • 如果您的扩展和目标扩展都是静态构建的,那么您当然可以使用更多的符号,但使用非导出符号不是一个好习惯。

我希望能够返回一个 SimpleXML 元素或一个 DomDocument 元素。

如果您需要显式实例化 aSimpleXMLElement或 a DOMDocument,您可以使用object_init_ex. 扩展通常会导出zend_class_entry *必须通过该宏的,但如果不是,您始终可以使用zend_lookup_class_ex. 这不会调用构造函数,因此如果需要,您仍然必须手动执行此操作。

一些扩展可能提供一个本地接口来实例化和初始化一个对象,但一般扩展不准备让其他扩展实例化它们的类型。

当然,您也可以像脚本一样调用返回任何这些类型的 PHP 函数和方法。你会得到一个zval *你可以从你的函数中返回的。

至于如何声明依赖关系,扩展描述符有一个条目。这将确保您的扩展在您声明依赖的扩展之后加载。有关在编译时声明依赖项,请参阅PHP_ADD_EXTENSION_DEP.

于 2012-03-20T17:55:55.363 回答
2

如果您正在编写扩展,那么Extending and Embedding PHP(又名“Sara's Book”)是必不可少的阅读材料。现在有点过时了,但是您可以在线或离线找到最好的资源。

于 2012-03-19T20:28:27.670 回答
1

我对 php 扩展编写不太了解,但如果你还没有读过它,你可以试试这个 http://devzone.zend.com/446/extension-writing-part-iii-resources/

使用它,您可以将任何类型的资源传递给 php 扩展

于 2012-03-19T19:38:32.613 回答