ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

是否可以从扩展中调用PHP_FUNCTION

2019-08-27 09:32:50  阅读:228  来源: 互联网

标签:php-extension php


让我详细说明标题.考虑例如PHP_FUNCTION(session_start).我是否能够从session_id中调用session_start,这是另一个PHP_FUNCTION(这只是为了说明而不是实际目的)?

解决方法:

嗯,是的,但你应该尽可能地避免它.编写函数内部实现的主要好处之一是,与PHP中发生的情况相反,C函数调用很便宜.另外,在C代码内部调用PHP函数是相对痛苦的.

例如,在session_start的情况下,您有php_session_start,它由会话扩展公开.由于我在第一段中描述的内容,扩展通常会导出可能对其他人有用的C函数.

实际上,内部PHP函数foo需要调用内部PHP函数栏,如果可能的话,最好的策略是定义一个辅助(非PHP_FUNCTION)C函数与大多数bar的实现.然后PHP_FUNCTION(foo)和PHP_FUNCTION(bar)都可以调用该辅助函数.

无论如何,调用PHP函数的最简单方法是使用call_user_function:

int call_user_function(HashTable *function_table, zval **object_pp,
    zval *function_name, zval *retval_ptr, zend_uint param_count,
    zval *params[] TSRMLS_DC);

变量call_user_function_ex还允许在参数发送参数时禁止分离,而不是指定符号表.

如果相关函数是内部(PHP_FUNCTION)或在用户空间中定义,则这将起作用.如果它是一个常规函数,你应该使用EG(function_table)作为第一个参数,第二个应该是NULL,我想你可以弄清楚其他的.

如果多次执行该功能,则效率不高.在这种情况下,请参阅以zend_fcall_开头的“Zend_API.h”中的函数.

我不建议使用其他选项来调用内部函数,例如手动设置参数堆栈和其他技巧,以及手动调用底层C函数.

标签:php-extension,php
来源: https://codeday.me/bug/20190827/1739438.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有