0

これはstackoverflowに関するこれまでの私の3番目の質問です:D

私はfirst_run.phpファイルでファイルとその場所を定義しています。ここで定義するファイルは、クラス、ヘルパー関数、およびその他の必要なファイルを含むファイルです。

開発の初期段階では、このfirst_run.phpには数行のコードしか含まれていませんが、新しいクラスや新しいファイルを追加するにつれて、この行は徐々に増えていきます。

また、ファイルの場所を特定のフォルダー内にグループ化するので、フォルダーをスキャンし、取得したファイルの名前を配列に入れて、require_onceをループできると思います。これにより、毎回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;

しかし、私は「後」のコードを試していません。これは可能ですか?または他のアプローチはありますか?または、そのままにしておく必要があります(ファイルをスキャンせずに行を追加し続けます)

前もって感謝します

4

4 に答える 4

3

代わりに自動読み込みの使用を検討してください。

自動読み込みを使用すると、ファイルを含める必要はまったくありません。その時点でPHPに認識されていない新しいクラスをインスタンス化するたびに、PHPは登録された自動ロード関数をトリガーします。この関数には、必要なファイルが含まれています。このように、必要なときに必要なものだけをロードするため、パフォーマンスが向上します。

PHP5.3の簡単な例

spl_autoload_register(function($className) {
    include "/path/to/lib/and/$className.php";    
});
$foo = new Foo;

を呼び出すnew Fooと、登録されたautoload関数はからのクラスを含めようとします/path/to/lib/and/Foo.php。ファイルの検索を容易にし、の量を減らすために、fiPEARなどのクラス名規則を使用することをお勧めしますinclude_paths

セキュリティと速度を向上させるために、配列を使用してクラス名からファイル名にマップする、より高度なオートローダーを提供できます。これにより、実際にアプリケーションの一部であるファイルのみを含めることができます。

参考文献:

于 2010-09-07T08:01:33.020 に答える
1

可能ですが、推奨されません。たとえば、誰かがそのディレクトリにphpファイルを作成できた場合、それを含めることになり、さらに、含める順序を予測することはできません。

代わりにこれを試してください:

$includes=array(
  'member',
  'phone',
  'profile',
  'talent',
);

foreach($includes as $fname) {
  require_once(MEMBERS.DS.$fname. '.php');

}

クラスを使用している場合は、@ Gordonが提案したように、自動読み込みの使用を検討してください。また、クラスを使用していなかった場合は、クラスの使用を検討してください:)

于 2010-09-07T08:03:42.077 に答える
0

「。」を無視する必要がありますが、一見するとコードは機能する可能性があります。foreachループの「..」。さらに、ファイルが「.php」で終わっているかどうかを確認します。

$member_files = scandir(MEMBERS.DS);
foreach($member_files as $member_file) {
    // Ignore non php files and thus ".." & "."
    if (!preg_match('/\.php$/', $member_file) {
      continue;
    }
    require_once(MEMBERS.DS.$member_file);
}
于 2010-09-07T08:04:57.737 に答える
0

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);
于 2010-09-07T14:05:40.943 に答える