PHP:检查是否包含文件

有时我们可能想知道某个文件是否包含在 PHP 脚本或者 CMS 中,为此我们可以使用 get_included_files 函数;该函数将返回一个包含 PHP 文件的绝对路径数组。

返回的列表并不总是一个完整的列表,因为在执行过程的不同点可能包含文件。
如果一个文件被一个函数或者方法包含,而 this 还没有被调用,那么该文件也不存在于包含文件列表中。

使用 Wordpress 时,我们可能需要使用钩子,因为这可能有助于获得更完整的文件列表;我们应该在我们的 Wordpress 教程中阅读有关此内容的更多信息。

我们可以像这样显示 get_included_files 函数的输出:

print_r(get_included_files());

或者,如果要将输出显示为纯文本:

header('content-type: text/plain; charset=UTF-8');
print_r(get_included_files());exit();

检查文件是否包含在内

get_included_files 函数将生成包含文件的列表,无论它们是否已使用 require、include、require_once 或者 include_once 包含在内

要了解这些不同语句之间的区别,我们可以阅读这篇文章:Include、Require、Include_once 和 Require_once

当你想检查一个文件是否被包含时,有两种简单的方法,一种是使用 get_included_files 函数,这是推荐的方法,另一种是使用 include_once 语句——但后者效果不佳,因为它如果已包含文件,则触发胎儿错误。

由于 get_included_files 返回一个路径数组,我们可以循环遍历数组以检查字符串是否包含我们正在寻找的文件路径:

$list_of_fules_arr = get_included_files();
$string_to_look_for = 'shortcodes.php';
foreach ($list_of_fules_arr as $file_path) {
  if (false !== strpos($file_path, $string_to_look_for)) {
    echo 'Found: ' . $file_path;exit();
  } 
}

改为显示所有包含的文件:

foreach ($list_of_fules_arr as $file_path) {
  echo $file_path . "\n";
}

从文件路径中提取文件名

我们通常只需要知道包含文件的文件名,但由于系统可能确实包含多个具有相同名称的文件 - 在不同的位置 - 不建议这样做。

但是,基本路径应该可以安全删除,这样我们仍然可以区分两个碰巧具有相同名称的文件之间的区别。
为此,我们首先需要确定基本路径,这只能从组合根(即

index.php) 依赖的文档根目录不一致。
相反,我们应该手动完成,如下所示:

define('BASE_PATH', rtrim(preg_replace('#[/\\]{1}#', '/', realpath(dirname(__FILE__))), '/') . '/');

现在我们已经定义了一个名为 BASE_PATH 的常量,我们可以用它来“切断”不相关的 /var/www/some_site/... 部分包含的文件路径:

foreach ($list_of_fules_arr as &$file_path) {
  $file_path = str_replace($file_path, '', BASE_PATH);
}
print_r($list_of_fules_arr);

输出:

Array
(
    [0] => /index.php
    [1] => /wp-blog-header.php
    [2] => /wp-load.php
    [3] => /wp-config.php
    [4] => /wp-settings.php
    [5] => /wp-includes/version.php
    [6] => /wp-includes/load.php
    ...
)
日期:2020-06-02 22:16:47 来源:oir作者:oir