如何从 PHP 扩展中重载函数?

Posted

技术标签:

【中文标题】如何从 PHP 扩展中重载函数?【英文标题】:How to overload functions from a PHP extension? 【发布时间】:2012-02-21 04:40:42 【问题描述】:

我一直在阅读一些 php 扩展教程,但我找不到任何关于如何重载现有函数的信息。

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

PHP_FUNCTION(fopen)

    if condition_is_true(condition)
        original_fopen();
    else
        show_error();

我怎么能这样做? 谢谢

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


编辑:找到解决方案,感谢 Gordon 链接。

我已经下载了函数rename_function 的PECL 包。它的源代码使我得出了必要的结论:

有一个全局哈希表function_table,它根据函数名称保存所有函数指针。

zend_hash_find/zend_hash_add/zend_hash_del 将允许我在此表中进行任何我想要的更改。

【问题讨论】:

我严重怀疑你会被允许这样做。 PHP 内置的某些函数会突然表现出与预期不同的行为,这将导致地狱般的地狱 【参考方案1】:

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

您可以使用它来创建一个名为 my_global_functions.php 的新 php 文件并像这样包含它

require_once "my_global_functions.php"

现在只需在那里创建一个新函数,例如

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

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

【讨论】:

我在我的问题中添加了注释,以澄清一点:我的意思是扩展名(用 C 编写,编译为 .so 并包含在 httpd.conf 中,而不是 .php 脚本)跨度>

以上是关于如何从 PHP 扩展中重载函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP >= 5.4 的特征中重载类构造函数

Python如何扩展`str`并重载其构造函数? [复制]

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

Kotlin 扩展函数和运算符重载[第一行代码 Kotlin 学习笔记]

Kotlin扩展函数与重载操作符解析

Kotlin扩展函数与重载操作符解析