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

时间:2016-02-06 06:45:10

标签: php fopen

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

这个想法有点像某种类似wordpress的功能......你将一个php文件添加到具有某些特征的插件文件夹中。例如,您添加的每个文件都必须包含$fileName变量。我的目标是从dir中的每个文件中获取每个$fileName并将它们推送到一个数组,这样我就可以调用数组来创建导航。然后,当使用ajax激活链接时,导航将加载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

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

此外,如果有人有更好的想法实现我的目标,我会全神贯注,并会欣赏建设性的批评。

谢谢,

3 个答案:

答案 0 :(得分:2)

试试这个:

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()(前者返回完整的Unix路径,后者只返回文件名)。
  • 习惯始终if()语句使用大括号,即使它们是可选的。
  • $fileName未设置,我认为您的意思是$line(位于上方)。

答案 1 :(得分:0)

好像你有文件路径问题,你可以定义并使用这个函数来读取你的目录所有文件用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;
}

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

答案 2 :(得分:0)

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

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

public文件夹中的脚本,../文件夹中的必需文件。 scandir('../')将返回

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

所以你需要函数,它返回文件的完整路径,或者自己创建这条路径。

提及D4V1D

UPD:glob()将解决您的问题。