从目录中读取 PHP 个文件并将每个文件中的公共变量推送到数组

Read PHP Files From A Directory And Push A Common Variable In Each File To An Array

我想写一个函数来读取目录中的所有文件并将每个文件中的公共变量值推送到数组。

这个想法有点像在某种程度上拥有类似 wordpress 的功能...您将 php 文件添加到具有某些特征的插件文件夹中。例如,您添加的每个文件都必须有一个 $fileName 变量。我的目标是从目录中的每个文件中获取每个 $fileName 并将它们推送到一个数组,这样我就可以调用该数组来创建导航。然后,当使用 ajax 激活 link 时,导航会将 php 文件加载到内容区域。

我的文件路径是,

/plugins/reports.php
/plugins/RandomPlugin2.php
/plugins/RandomPlugin3.php

我试图通过这样的方式完成这项工作,

/assets/load-plugins.php

function loadPlugins(){
$files = scandir('../plugins/');
foreach($files as $file) {
 if(($file_handle = fopen($file, "r")))
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   echo $fileName;
}
fclose($file_handle);
}
}

loadPlugins();

但这是我得到的错误,

Warning: fopen(reports.php) [function.fopen]: failed to open stream: No such file or directory in /Applications/AMPPS/www/wubase/assets/load-plugins.php on line 12

Warning: fclose() expects parameter 1 to be resource, boolean given in /Applications/AMPPS/www/wubase/assets/load-plugins.php on line 17

它告诉我没有这样的文件或目录,但它甚至提到当前在插件目录中的文件。这可能是权限问题,因为我试图从不同的目录打开文件吗?

此外,如果有人有更好的想法来实现我的目标,我会洗耳恭听并感谢建设性的批评。

谢谢,

似乎你的文件路径有问题,你可以定义并使用这个函数来读取你的目录中所有带有 ab

的文件
function dirToArray($dir) {

  $result = array();      
  $cdir = scandir($dir);

  foreach ($cdir as $key => $value){
    if (!in_array($value,array(".",".."))){
        if (is_dir($dir . DIRECTORY_SEPARATOR . $value)){
            $result = array_merge(
                   $result, 
                   dirToArray($dir . DIRECTORY_SEPARATOR . $value) 
            );
        }else{
            $result[] = $dir . DIRECTORY_SEPARATOR . $value;
        }
    }
  }

   return $result;
}

它将为您提供位于上述目录或子目录中的所有具有绝对路径的文件

scandir return只是文件或目录的名称(不是完整路径)。所以,例如

.
├── 1.txt
├── 2.txt
├── 3.txt
└── public
    └── script.php

您的脚本在 public 文件夹中,所需文件在 ../ 文件夹中。 scandir('../') 将 return

array (
  0 => '.',
  1 => '..',
  2 => '1.txt',
  3 => '2.txt',
  4 => '3.txt',
  5 => 'public',
);

所以你需要函数,return文件的完整路径,或者自己创建这个路径。


UPD: 因为 D4V1D mentioned, glob() 会解决你的问题。

试试这个:

function loadPlugins() {
    $files = glob('../plugins/');

    foreach($files as $file) {
        if(($file_handle = fopen($file, "r"))) {
            while (!feof($file_handle)) {
                $line = fgets($file_handle);
                echo $line;
            }
        }
        fclose($file_handle);
    }
}
  • 将函数切换到glob()而不是scandir()(前者returns完整的Unix路径,而后者returns只有文件名)。
  • 养成 始终if() 语句中使用大括号的习惯,即使它们是可选的。
  • $fileName 未设置,我假设您的意思是 $line(设置在正上方)。