1

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

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

==更新===

好的。让我们更深入。

假设我们有/home/me/repos/目录,放置我们的 git 模块和一个虚拟主机/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');

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

现在我找到了使用绝对路径的解决方法,无论如何我必须在我的项目中创建一个个人配置。我也打算/home/me/repos/在需要时将 chdir() 放入(并<Directory>在 vhost 中描述部分),但这是个坏主意。

4

2 回答 2

2

来自PHP 手册

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

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

于 2011-08-03T11:30:35.180 回答
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
于 2012-04-26T10:12:17.127 回答