如何删除包含文件?
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;
}
为了给来到这里的其他人提供选择,我自己偶尔使用了一些解决方案...
- 如果您要包含的文件是为了某些具有 return 值的功能或不需要在页面上显示的某些执行(例如邮寄内容),假设您不能 更改任何一个目标文件(假设它们是其他人的代码或您 确实 高度集成的其他软件的一部分不想解开。
一个解决方案是为这两个文件创建一个快速但肮脏的 restful 接口,以从它们中提取您需要的内容,然后在您的程序中调用该接口,从而有效地绕过包含它们的需要。
一个更糟糕的方法,但如果你的情况真的很绝望,并且确实是最后的手段,并且只在某些情况下有效(例如,会在命名空间上中断)...
$bad_idea = file_get_contents("foo.php");
eval($bad_idea);
未设置($bad_idea);
再次注意,这是万不得已的选择。
我的页面中包含两个文件。像这样:
// 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;
}
为了给来到这里的其他人提供选择,我自己偶尔使用了一些解决方案...
- 如果您要包含的文件是为了某些具有 return 值的功能或不需要在页面上显示的某些执行(例如邮寄内容),假设您不能 更改任何一个目标文件(假设它们是其他人的代码或您 确实 高度集成的其他软件的一部分不想解开。
一个解决方案是为这两个文件创建一个快速但肮脏的 restful 接口,以从它们中提取您需要的内容,然后在您的程序中调用该接口,从而有效地绕过包含它们的需要。
一个更糟糕的方法,但如果你的情况真的很绝望,并且确实是最后的手段,并且只在某些情况下有效(例如,会在命名空间上中断)...
$bad_idea = file_get_contents("foo.php");
eval($bad_idea);
未设置($bad_idea);
再次注意,这是万不得已的选择。