我正在为个人项目创建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使用。
答案 0 :(得分:4)
是的,扩展实际上可能取决于其他人。他们可以:
zend_call_function
和zend_lookup_class_ex
。php_extensionname.h
中声明的任何导出符号和结构(这些标头是唯一被认为是导出其他扩展的本机API的标头)。但是,某些扩展实际上可能不会导出在这些头文件中声明的某些符号,您必须查找使用PHPAPI
声明的符号。请注意,某些扩展名无法停用,您可以依赖它们(例如,从5.3 / 5.4开始,标准版,SPL版,反射版,日期版,pcre版,ereg版)。我希望能够返回一个SimpleXML元素或一个DomDocument元素。
如果您需要显式实例化SimpleXMLElement
或DOMDocument
,则可以使用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扩展