如何删除包含文件?

How to remove an include file?

我的页面中包含两个文件。像这样:

// mypage.php
include 'script1.php';
include 'script2.php';

我首先需要他们两个,然后我需要删除其中一个,像这样:

if ($var == 'one') {
      // inactive script1.php file
} else {
     // inactive script2.php file
}

这很难解释为什么我需要停用其中之一,我只是想知道,我该怎么做?是否可以做与 include 不同的事情?

简单的回答是否定的,你不能。

扩展的答案是,当您 运行 PHP 时,它会进行两次传递。第一遍将 PHP 编译成机器代码。这是添加 include 的地方。第二遍是执行第一遍的代码。由于编译过程是 include 完成的地方,因此无法在 运行 时删除它。

由于您遇到了函数冲突,以下是使用对象(classes)

解决此问题的方法
class Bob {
    public static function samename($args) {

   }
}
class Fred {
   public static function samename($args) {

   }
}

请注意,两个 class 都具有 samename() 功能,但它们位于不同的 class 中,因此不会发生冲突。因为它们是 static 你可以这样称呼它们

Bob::samename($somearghere);
Fred::samename($somearghere);

你唯一的选择是这样的:

if ($var == 'one') {
      include('script2.php');
} else {
     include('script1.php');
}

你不能'remove'代码,你只能选择不include/execute它放在首位。

根据你的评论,你说这是因为函数名称重复,我假设你在其他地方分别使用这两个文件,但你现在试图实现的是出于不同的原因将这些文件合并在一起(两个文件都有functions/variables, 等你需要的)

如果你的第一个文件有这样的函数my_function:

my_function() {
    // code here
}

你的第二个文件也有相同的命名函数,你可以在它周围加上一个 if 语句来排除它:

if (!function_exists('my_function')) {
    my_function() {
        // code here
    }
}

这样,当将两个文件合并在一起时,第二个文件的功能将不可用,但单独使用文件时,两个功能都可用。

如果您只需要任一文件的输出,您可以这样做

ob_start();
include('file1.php');
$file1 = ob_get_contents();

ob_start();
include('file2.php');
$file2 = ob_get_contents();

然后如果你需要打电话给他们

if ($var == 'one') {
    echo $file2;
} else {
    echo $file1;
}

为了给来到这里的其他人提供选择,我自己偶尔使用了一些解决方案...

  1. 如果您要包含的文件是为了某些具有 return 值的功能或不需要在页面上显示的某些执行(例如邮寄内容),假设您不能 更改任何一个目标文件(假设它们是其他人的代码或您 确实 高度集成的其他软件的一部分不想解开。

一个解决方案是为这两个文件创建一个快速但肮脏的 restful 接口,以从它们中提取您需要的内容,然后在您的程序中调用该接口,从而有效地绕过包含它们的需要。

  1. 一个更糟糕的方法,但如果你的情况真的很绝望,并且确实是最后的手段,并且只在某些情况下有效(例如,会在命名空间上中断)...

    $bad_idea = file_get_contents("foo.php");

    eval($bad_idea);

    未设置($bad_idea);

再次注意,这是万不得已的选择。