有没有办法覆盖不同文件中的定义?

时间:2013-09-06 22:50:47

标签: php wordpress require

我正在尝试创建一个界面,用于在托管20多个WordPress站点的服务器上更新WordPress插件的所有实例。我已经完成了所有工作,除了我有一个循环:

require_once($path.'/wp-load.php');
require_once($path.'/wp-admin/includes/admin.php');
require_once($path.'/wp-admin/includes/class-wp-upgrader.php');

其中$path等于网站目录($path随循环的每次迭代而变化。)

我需要以这种方式需要文件的原因是因为wp-load.php包含(除其他外)一个名为wp-config.php的文件,它定义了SQL数据库之类的东西,每个网站之间都有所不同。

TL& DR 并说明我的实际问题:

我有什么方法可以做以下代码吗?

require_once("dir1/a.php"); // define("VAR","dir1");
echo VAR; // displays "dir1"
unrequire_once("dir1/a.php");

require_once("dir2/a.php"); // define("VAR","dir2");
echo VAR; // displays "dir2"

2 个答案:

答案 0 :(得分:0)

由于您已经提到过这是一个内部工具,您可以考虑使用runkit来在运行时删除常量,以便以后重新定义:http://www.php.net/manual/en/function.runkit-constant-remove.php


害怕没有 - 即使你可以,你也不会得到你正在寻找的行为,因为常量(define)只能创建一次,并且就像其余的执行一样。它们不能被删除,也不能在此后更改。

不幸的是,您将不得不重新设计脚本(例如,使用变量而不是常量)。

答案 1 :(得分:0)

是的:分叉过程。你可以这样做:

foreach ($pathlist as $path) {
    $pid = pcntl_fork();
    if(!$pid) {
        require_once($path.'/wp-load.php');
        require_once($path.'/wp-admin/includes/admin.php');
        break;
    }
}

这将为列表中的每个$ path创建脚本副本,并解决require_once问题。

如果它是一个孩子,你需要“打破”循环,因为你只希望子进程为其单独的$ path设置运行而不是继续循环本身!