使用PHP.scandir()扫描文件,然后在扫描完文件后要求

使用PHP.scandir()扫描文件,然后在扫描完文件后要求,php,loops,scandir,Php,Loops,Scandir,这是我到目前为止关于stackoverflow的第三个问题:D 我在第一个_run.php文件中定义文件及其位置, 我在这里定义的文件是那些包含类、助手函数的文件 以及所需的任何其他文件 在早期开发中,这个first_run.php只包含几行代码 但是,随着我添加一些新类或新文件,这一行逐渐增加 由于我将文件的位置分组到一个特定的文件夹中,我想也许我可以扫描该文件夹,将检索到的文件的名称放入一个数组中,然后循环require_一次,这样我就不必每次在文件夹中添加新文件时都编辑first_run.

这是我到目前为止关于stackoverflow的第三个问题:D

我在第一个_run.php文件中定义文件及其位置, 我在这里定义的文件是那些包含类、助手函数的文件 以及所需的任何其他文件

在早期开发中,这个first_run.php只包含几行代码 但是,随着我添加一些新类或新文件,这一行逐渐增加

由于我将文件的位置分组到一个特定的文件夹中,我想也许我可以扫描该文件夹,将检索到的文件的名称放入一个数组中,然后循环require_一次,这样我就不必每次在文件夹中添加新文件时都编辑first_run.php

我的第一个方法是使用scandir()

之前:

defined('INC_PATH') ? null : define('INC_PATH', SITE_ROOT.DS.'includes');
defined('MEMBERS') ? null : define('MEMBERS', INC_PATH.DS.'models'.DS.'members');

require_once(MEMBERS.DS.'member.php');
require_once(MEMBERS.DS.'phone.php');
require_once(MEMBERS.DS.'profile.php');
require_once(MEMBERS.DS.'talent.php');
require_once(MEMBERS.DS.'profile_picture.php');
require_once(MEMBERS.DS.'audio.php');
require_once(MEMBERS.DS.'video.php');
require_once(MEMBERS.DS.'gallery.php');
require_once(MEMBERS.DS.'statistik.php');
require_once(MEMBERS.DS.'inbox.php');
require_once(MEMBERS.DS.'comment.php');
require_once(MEMBERS.DS.'picked_stat.php');
require_once(MEMBERS.DS.'log.php');
之后是这样的:

$member_files = scandir(MEMBERS);
foreach($member_files as $member_file):
    require_once(MEMBERS.DS.$member_file);
endforeach;
不过我还没有尝试“after”代码。 这可能吗??或者还有其他方法吗??或者我应该保持这种方式(继续添加行而不扫描文件)

提前感谢

考虑改用

使用自动加载,您根本不必费心包含文件。每当您实例化一个PHP当时不知道的新类时,PHP都会触发已注册的自动加载函数。该函数包含所需的文件。这样,您只在需要时加载所需内容,这将提高性能

PHP5.3的简单示例

spl_autoload_register(function($className) {
    include "/path/to/lib/and/$className.php";    
});
$foo = new Foo;
调用
newfoo
时,注册的自动加载函数将尝试包含
/path/to/lib/和/Foo.php
中的类。建议使用类名约定,如f.i.,以使查找文件更容易,并减少文件的数量

为了提高安全性和速度,您可以提供一个更安全的方法,从而确保只包含实际属于应用程序一部分的文件

进一步阅读:

    • 考虑改用

      使用自动加载,您根本不必费心包含文件。每当您实例化一个PHP当时不知道的新类时,PHP都会触发已注册的自动加载函数。该函数包含所需的文件。这样,您只在需要时加载所需内容,这将提高性能

      PHP5.3的简单示例

      spl_autoload_register(function($className) {
          include "/path/to/lib/and/$className.php";    
      });
      $foo = new Foo;
      
      调用
      newfoo
      时,注册的自动加载函数将尝试包含
      /path/to/lib/和/Foo.php
      中的类。建议使用类名约定,如f.i.,以使查找文件更容易,并减少文件的数量

      为了提高安全性和速度,您可以提供一个更安全的方法,从而确保只包含实际属于应用程序一部分的文件

      进一步阅读:


      这是可能的,但不推荐使用,例如,如果有人在该目录上创建一个php文件,您将最终包含它,此外,您无法预测包含顺序

      请尝试以下方法:

      $includes=array(
        'member',
        'phone',
        'profile',
        'talent',
      );
      
      foreach($includes as $fname) {
        require_once(MEMBERS.DS.$fname. '.php');
      
      }
      

      如果您使用类,请考虑使用AutoLoad,正如戈登建议的那样。如果你不使用类,考虑使用它们:

      这是可能的,但不推荐,比如如果有人可以在那个目录上创建PHP文件,你将包括它,此外,你不能预测包含顺序。 请尝试以下方法:

      $includes=array(
        'member',
        'phone',
        'profile',
        'talent',
      );
      
      foreach($includes as $fname) {
        require_once(MEMBERS.DS.$fname. '.php');
      
      }
      

      如果您使用类,请考虑使用AutoLoad,正如戈登建议的那样。如果你不使用类,考虑使用它们:

      乍一看,你的代码可以工作,尽管你必须忽略Fr.C.和“..”在Frach循环中。另外,我还要检查文件是否以“.php”结尾:


      乍一看,您的代码可以工作,尽管您必须忽略foreach循环中的“.”和“.”。另外,我还要检查文件是否以“.php”结尾:

      创建2个函数

      function GetFiles($directory,$exempt = array('.','..','.ds_store','.svn'),&$files = array()) {
          $handle = opendir($directory);
          while(false !== ($resource = readdir($handle))){
              if(!in_array(strtolower($resource),$exempt)){
                  if(is_dir($directory.$resource.'/'))
                      array_merge($files, self::GetFiles($directory.$resource.'/',$exempt,$files));
                  else
                      $files[] = $directory.$resource;
              }
          }
          closedir($handle);
          return $files;
        }
      
      
        function Autoload($includes = array()){
          $files = array();
          foreach($includes as $directory)
            $files[] = self::GetFiles($directory);
      
          foreach($files as $k=>$v){
            foreach($v as $k1=>$v1)
              require_once($v1);
          }
        }
      
      to use it:
      $includes = array(
          'C:WWW/project/helpers/',
          'C:WWW/project/lang/',
          'C:WWW/project/lib/',
          'C:WWW/project/mod/',
        );
      Autoload($includes);
      
      创建2个函数

      function GetFiles($directory,$exempt = array('.','..','.ds_store','.svn'),&$files = array()) {
          $handle = opendir($directory);
          while(false !== ($resource = readdir($handle))){
              if(!in_array(strtolower($resource),$exempt)){
                  if(is_dir($directory.$resource.'/'))
                      array_merge($files, self::GetFiles($directory.$resource.'/',$exempt,$files));
                  else
                      $files[] = $directory.$resource;
              }
          }
          closedir($handle);
          return $files;
        }
      
      
        function Autoload($includes = array()){
          $files = array();
          foreach($includes as $directory)
            $files[] = self::GetFiles($directory);
      
          foreach($files as $k=>$v){
            foreach($v as $k1=>$v1)
              require_once($v1);
          }
        }
      
      to use it:
      $includes = array(
          'C:WWW/project/helpers/',
          'C:WWW/project/lang/',
          'C:WWW/project/lib/',
          'C:WWW/project/mod/',
        );
      Autoload($includes);
      

      回答你的问题,是的,这应该有效。这并不意味着你应该这样做。因此,最好的做法是,我应该坚持我目前正在做的事情(如果创建了新文件,则编辑first_run.php)?嗨,这可能不是最好的解决方案。如果您有包含更多文件的子文件夹,该怎么办。我现在没有完整的解决方案(因为我在工作)。但是如果你能稍等一下,我可以稍后给你回答你的问题,是的,这应该行。这并不意味着你应该这样做。因此,最好的做法是,我应该坚持我目前正在做的事情(如果创建了新文件,则编辑first_run.php)?嗨,这可能不是最好的解决方案。如果您有包含更多文件的子文件夹,该怎么办。我现在没有完整的解决方案(因为我在工作)。但如果你能稍等一下,我可以稍后再问你=)跟@NullUserException一样的问题;因此,最好的做法是,我应该坚持我目前正在做的事情(如果创建了新文件,则编辑first_run.php)??如果这些文件包含类,最好的方法是使用自动加载,如果其中一些文件包含一些设置或基类(通常使用的设置或基类)。我相信你最初发布的代码是最好的方式,我发布的方式将代码最小化,并使添加新的包含文件的速度更快,以演示如何完成这项工作,但不是更好:)向@NullUserException提出相同的问题;因此,最好的做法是,我应该坚持我目前正在做的事情(如果创建了新文件,则编辑first_run.php)??如果这些文件包含类,最好的方法是使用自动加载,如果其中一些文件包含一些设置或基类(通常使用的设置或基类)。我相信您最初发布的代码是最好的方式,我发布的方式可以最小化代码并使添加新的包含文件更快一些,以演示如何完成这项工作,但并不是更好:)