“返回”;本地的;来自扩展的PHP对象

“返回”;本地的;来自扩展的PHP对象,php,c,php-extension,php-internals,Php,C,Php Extension,Php Internals,我正在尝试为个人项目创作。除了上面文章中的链接之外,我对zend_引擎一无所知,我的C语言技能已经过时10年了,而且只是学术性的。所有这些都意味着“如果我似乎在问一个愚蠢的问题,我可能是” 是否可以在我自己的扩展中从其他PHP扩展调用函数,或者每个PHP扩展都被视为一个孤岛,而不了解系统的其他部分?如果可能的话,这是一种常见的做法,还是一个坏主意™? 也就是说,我知道我可以返回这样的字符串 PHP_FUNCTION(hello_world) { char *str; str =

我正在尝试为个人项目创作。除了上面文章中的链接之外,我对zend_引擎一无所知,我的C语言技能已经过时10年了,而且只是学术性的。所有这些都意味着“如果我似乎在问一个愚蠢的问题,我可能是”

是否可以在我自己的扩展中从其他PHP扩展调用函数,或者每个PHP扩展都被视为一个孤岛,而不了解系统的其他部分?如果可能的话,这是一种常见的做法,还是一个坏主意™?

也就是说,我知道我可以返回这样的字符串

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

我希望能够返回SimpleXML元素或DomDocument元素。事实证明,谷歌搜索很困难,因为没有太多关于扩展开发的信息,也没有太多关于标准PHP使用的信息

我对php扩展编写知之甚少,但如果您还没有读过的话,可以试试这个


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

如果您正在编写扩展,那么(又名“Sara的书”)是必不可少的阅读材料。它现在有点过时了,但是您可以在网上或网下找到最好的资源。

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

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

如果需要显式实例化
simplexmlement
DOMDocument
,可以使用。扩展通常导出必须传递该宏的
zend\u class\u条目*
,但如果没有,则始终可以使用
zend\u lookup\u class\u ex
。这不会调用构造函数,因此如果需要,仍然必须手动执行此操作

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

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


至于如何声明依赖项,扩展描述符对此有一个明确的定义。这将确保在声明所依赖的扩展之后加载扩展。有关在编译时声明依赖项的信息,请参见。

Nice question;不过,如果Zend文档没有对此提供任何说明,我会感到惊讶。@KerrekSB,这是一个很好的RTFM:)。如果您(或任何人)知道一个zend文档对此有很好的概述,并且没有假定有5年以上的扩展黑客经验(甚至有经验),我很乐意看到它。