从扩展中返回“本机”PHP对象

时间:2012-03-19 16:31:37

标签: php c php-extension php-internals

我正在为个人项目创建a PHP extension。除了上面文章中的内容之外,我对zend_engine一无所知,而且我的C技能已经过时了10年,并且只是学术性的。所有这些都是说“如果我好像在问一个愚蠢的问题,我可能就是”。

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

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

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

我希望能够返回一个SimpleXML元素或一个DomDocument元素。谷歌搜索已经证明是困难的,因为扩展开发并没有那么多,并且有很多标准的PHP使用。

3 个答案:

答案 0 :(得分:4)

是的,扩展实际上可能取决于其他人。他们可以:

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

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

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

某些扩展可能提供实例化和初始化对象的本机接口,但通常扩展不准备让其他扩展实例化其类型。

当然,您也可以像脚本一样调用返回任何类型的PHP函数和方法。您将获得zval *,然后您可以从您的函数返回。

关于如何声明依赖项,扩展描述符对此有一个entry。这将确保您声明依赖的扩展名已加载。要在编译时声明依赖项,请参阅PHP_ADD_EXTENSION_DEP

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我对php扩展写作知之甚少,但你可以试试这个,如果你还没有读过它 http://devzone.zend.com/446/extension-writing-part-iii-resources/

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