2009-03-01 4 views
190

非常に高速n00b質問、PHPで私はスクリプトのディレクトリを含めることができます。ディレクトリからすべてのPHPファイルをインクルードするにはどうすればいいですか?

すなわちの代わりに:

include('classes/Class1.php'); 
include('classes/Class2.php'); 

のようなものがあります:

include('classes/*'); 

は、特定のクラスのために、約10のサブクラスのコレクションを含むための良い方法を見つけるように見えることができませんでした。

答えて

364
foreach (glob("classes/*.php") as $filename) 
{ 
    include $filename; 
} 
+3

インクルード()を使用してきれいに見える方法。 しかしこれはうまくいくでしょう。みんな、ありがとう。 – occhiso

+5

私は構成ファイルを使って適切なモジュールシステムを構築しますが、それは単なる*すべてを含むよりもずっと柔軟性があるからです。 :-) – staticsan

+3

注意:現在のディレクトリにファイルを含めるためにのみ動作します。 get_include_path()を反復することは可能ですが、これはすぐに退屈になります。 – nalply

0

私はreaddir()関数を使用し、そのファイルをループしてインクルードすることをお勧めします(そのページの最初の例を参照)。

18

PHP 5を使用している場合は、代わりにautoloadを使用します。

49

これは、PHP 5のいくつかのフォルダからたくさんのクラスを取り込む方法です。これは、クラスを持っている場合にのみ機能します。

/*Directories that contain classes*/ 
$classesDir = array (
    ROOT_DIR.'classes/', 
    ROOT_DIR.'firephp/', 
    ROOT_DIR.'includes/' 
); 
function __autoload($class_name) { 
    global $classesDir; 
    foreach ($classesDir as $directory) { 
     if (file_exists($directory . $class_name . '.php')) { 
      require_once ($directory . $class_name . '.php'); 
      return; 
     } 
    } 
} 
+1

+1に変更して自動ロードします。 [autoload関数](http://php.net/manual/en/function.autoload.php)、 [自動ロード機能](http://php.net/manual/en/language.oop5.autoload.php ) –

+1

この質問は、ディレクトリ内のすべてのものを含むことに関するものであったため、自動ロードは関係ありません。通常、これは異なるディレクトリにあります。例えば、BEディレクトリに定義されたDataClassとBLディレクトリに定義されたBL.class.php。 – Carmageddon

+1

グローバルの使用は解決策ではありません – Peter

19

これはあなたがset_include_path使用することができますカルステンのコード

function include_all_php($folder){ 
    foreach (glob("{$folder}/*.php") as $filename) 
    { 
     include $filename; 
    } 
} 

include_all_php("my_classes"); 
+9

これは、受け入れられた回答に関連するものは追加しません。 – moopet

+0

これは何らかの理由で実際に働いた唯一のコードでした。 –

9

の単なる変形例である:含まれるように)(何も書き込みに機能もしない

set_include_path('classes/'); 

http://php.net/manual/en/function.set-include-path.php

+12

ディレクトリ内の全てのphpファイルを自動的にインクルードするのではなく、単に 'include /' require'を使うとき 'classes /'を省略することができます – Gherman

-2

をディレクトリ内のファイル。変数スコープを失う可能性があり、 "グローバル"を使用する必要があります。ファイルをループするだけです。

また、他のファイルで定義されている他のクラスに拡張されるクラス名がインクルードされたファイルに含まれていると、問題が発生する可能性があります。ので注意してください。

+1

"変数スコープを失う"という意味は? – piyush

+2

再利用する場合は必ず関数を使用するか、単にコードをより「自己文書化」するようにしてください。 「グローバルスコープ」の問題は赤ちゃんだと思います。 「グローバルスコープ」を使用しているときはいつでも、コードを書き直すことを真剣に考えてみたいです。 –

+0

範囲のための非常に良い点! – Nick

26

私はあなたがまだphpの意志を含まれていなかった新しいクラスを呼び出すたびその後__autoload代わりに使用して...

function __autoload($class_name) { 
    require_once('classes/'.$class_name.'.class.php'); 
} 

$user = new User(); 

をYOURクラスが含まれていない...これは古い記事ですが、実現します自動火災__autoloadとあなたはあなたが使用することができ、一度に各クラスを定義することなく、クラスの束を含めるように見ている場合

0

のためにそれを含める:

$directories = array(
      'system/', 
      'system/db/', 
      'system/common/' 
); 
foreach ($directories as $directory) { 
    foreach(glob($directory . "*.php") as $class) { 
     include_once $class; 
    } 
} 

を使用すると、jのことができますこの方法クラスを含むPHPファイルのクラスを定義してください。リスト全体ではありません$thisclass = new thisclass();

どのようにすべてのファイルを処理するのでしょうか?私はこれで少しのスピード低下があるかもしれません。

$dir = "classes/"; 
$dh = opendir($dir); 
$dir_list = array($dir); 
while (false !== ($filename = readdir($dh))) { 
    if($filename!="."&&$filename!=".."&&is_dir($dir.$filename)) 
     array_push($dir_list, $dir.$filename."/"); 
} 
foreach ($dir_list as $dir) { 
    foreach (glob($dir."*.php") as $filename) 
     require_once $filename; 
} 

が、それはあなたのファイルを含めるようにアルファベット順を使用することを忘れないでください:

1

あなたがディレクトリとそのサブディレクトリ内のすべてを含めたい場合。

+1

"アルファベット順" Wrong ... "を使用することを忘れないでください。エントリはファイルシステムによって保存された順に返されます。 - http://php.net/manual/en/function。 readdir.php – NemoStein

+1

ファイルが互いに依存しており、その順序が依存関係と一致しない場合、これは機能しない可能性があります –

11

2017年にこれを実行する方法:

spl_autoload_register(function ($class_name) { 
    $CLASSES_DIR = __DIR__ . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR; // or whatever your directory is 
    $file = $CLASSES_DIR . $class_name . '.php'; 
    if(file_exists($file)) include $file; // only include if file exists, otherwise we might enter some conflicts with other pieces of code which are also using the spl_autoload_register function 
}); 

ここではPHPのドキュメントで推奨:Autoloading classes

1

NOがここに...ファイル間の依存関係のinclude_onceする再帰関数である場合すべてのサブディレクトリにあるすべてのPHPファイル:

$paths = array(); 

function include_recursive($path, $debug=false){ 
    foreach(glob("$path/*") as $filename){   
    if(strpos($filename, '.php') !== FALSE){ 
     # php files: 
     include_once $filename; 
     if($debug) echo "<!-- included: $filename -->\n"; 
    } else { # dirs 
     $paths[] = $filename; 
    } 
    } 
    # Time to process the dirs: 
    for($i=count($paths)-1; $i>0; $i--){ 
    $path = $paths[$i]; 
    unset($paths[$i]); 
    include_recursive($path); 
    } 
} 

include_recursive("tree_to_include"); 
# or... to view debug in page source: 
include_recursive("tree_to_include", 'debug'); 
関連する問題