如何重新定义PHP中的函数?

时间:2011-08-03 11:28:30

标签: php function redefinition

现在我坚持使用file_exists()函数。我的项目是从存储库构建的,一个是符号链接为DocRoot,另一个是通过include_path可用于php解释器。但默认的file_exists()无法查看文件放在include_path下的某个地方,所以我需要或以某种方式用包装器重新定义这个func或者自己编写,将它包含在其他模块中并替换目录树中此func的所有匹配项。这是可能的,但不是很好,对于开发人员来说并不清楚。

我已经看过pecl-apd(2008)和pecl-runkit(2007),但我的gentoo存储库或叠加层中没有其他的pecls。那么,如何以现代方式重新定义函数呢?

== upd ===

确定。让我们深入一点。

假设我们有放置git模块的/home/me/repos/目录和一个虚拟主机/var/srv/domain.com,所有这些都是汇编的

repos_
      \_site_root_
                  \_.git
                   \_file1
       \_module1_
                 \_.git
                  \_we_need_this_file_too
        \_module2_
                  \_.git
domain.com_
           \_htdocs –> ~/repos/site_root
            \_tmp

所以我们需要以某种方式将包含模块1和2的文件夹包含到项目中。然后通过vhost config将路径添加到〜/ repos到php include_path

php_admin_value include_path ".:/home/me/repos"

现在php可以

include ('module1/we_need_this_file_too');

来自我的repos目录。但是当它在包含file_exists()之前尝试检查文件时,它会失败,因为那些目录仍然对file_exists()关闭。这就是问题所在。

现在我找到了一个绝对路径的解决方法,无论如何我必须在我的项目中创建个人配置。我还想将chdir()转换为/home/me/repos/时需要(并在vhost中描述<Directory>部分),但这不是一个好主意。

2 个答案:

答案 0 :(得分:2)

来自PHP manual

  

PHP不支持函数重载,也不可能取消定义或重新定义以前声明的函数。

好吧,正如您已经提到的,如果您安装runkit extension并使用runkit_function_redefine,或者安装APD并使用override_function,则可以。

答案 1 :(得分:1)

我正在使用php5.3中的函数重新定义库

来源:https://github.com/Bubujka/bu.defun

例子:http://defun.bubujka.org/doc.html

简单重新定义:

<?php
def('name', function(){ 
    echo "Waserd"; 
});
name();
echo "\n";

def('name', function(){ 
    echo "Bubujka"; 
});
name();

---

Waserd
Bubujka