gpt4 book ai didi

php - 从扩展返回 "Native"PHP 对象

转载 作者:IT王子 更新时间:2023-10-28 23:55:20 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

I'd like to be able to return, say, a SimpleXML element, or a DomDocument element.

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

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

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

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

关于php - 从扩展返回 "Native"PHP 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9774007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com