Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从PHP扩展重载函数?_Php_Php Internals - Fatal编程技术网

如何从PHP扩展重载函数?

如何从PHP扩展重载函数?,php,php-internals,Php,Php Internals,我已经阅读了一些PHP扩展教程,但是我找不到任何关于如何重载现有函数的信息 例如,我想将fopen()更改为 PHP_FUNCTION(fopen) { if condition_is_true(condition) original_fopen(); else show_error(); } 我怎么能这么做? 多谢各位 我指的是扩展名(用C编写,编译成.so并包含在httpd.conf中,而不是.php程序中) 编辑:多亏了Gordon li

我已经阅读了一些PHP扩展教程,但是我找不到任何关于如何重载现有函数的信息

例如,我想将fopen()更改为

PHP_FUNCTION(fopen)
{
    if condition_is_true(condition)
        original_fopen();
    else
        show_error();
}
我怎么能这么做? 多谢各位

我指的是扩展名(用C编写,编译成.so并包含在httpd.conf中,而不是.php程序中)


编辑:多亏了Gordon links,找到了解决方案。

我已经下载了函数的PECL包
rename\u function
。它的源代码让我得出了必要的结论:

  • 有一个全局哈希表
    function\u table
    ,它根据函数名保存函数的所有指针

  • zend\u hash\u find
    /
    zend\u hash\u add
    /
    zend\u hash\u del
    将允许我在此表中进行任何更改


如果您使用的是Zend Framework,那么所有请求都将通过相同的引导文件(通常是公共目录中的
index.php

您可以使用它创建一个名为
my\u global\u functions.php的新php文件,并像

require_once "my_global_functions.php"
现在只需在那里创建一个新函数,如

function my_fopen(){ 
    if condition_is_true(condition)
        fopen();
    else
        show_error();        
}

您现在应该可以在代码中的任何位置调用
我的fopen

我严重怀疑您是否被允许这样做。这将导致PHP中内置的某些函数突然表现出与预期不同的行为。我在问题中添加了注释,稍微澄清一下:我指的是扩展(用C编写,编译为.so,包含在httpd.conf中,而不是.PHP脚本中)