2010-09-07 28 views
0

這是我的第三個問題迄今在計算器:d使用PHP.scandir()掃描文件,然後require_once他們

我定義我的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; 

我還沒有嘗試,雖然在 '後' 的代碼。 這是可能的嗎?或者有沒有其他的辦法?或者我應該剛剛離開這種方式(不斷增加的線而無需掃描文件)

在此先感謝

+0

要回答你的問題,是的,這應該工作。這並不意味着你應該這樣做。 – NullUserException 2010-09-07 08:03:47

+0

所以最好的做法是,我應該堅持我目前正在做的事情(編輯first_run.php,如果新文件被創建)? – littlechad 2010-09-07 08:06:59

+0

嗨,這可能不是最好的解決方案。如果您擁有擁有更多文件的子文件夾,該怎麼辦?我現在有充分的解決方案(就像在工作)。但如果你可以掛在一點,我可以給你以後=) – nuttynibbles 2010-09-07 08:18:46

回答

3

考慮使用Autoloading代替。

通過自動加載,您不必費心加入文件。每當你實例化一個PHP不知道的新類時,PHP將觸發已註冊的自動加載函數。該功能包括所需的文件。這樣,您只需在需要時加載所需內容,這應該會提高性能。

與PHP5.3

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

當你調用new Foo簡單的例子,註冊的自動加載功能將嘗試包括/path/to/lib/and/Foo.php類。建議使用類名稱約定,如f.i. PEAR,以便更容易找到文件,並減少include_paths的數量。

爲了獲得更高的安全性和速度,您可以提供更多sophisticated Autoloader that uses an array to map from classname to filename,從而確保只有實際屬於應用程序一部分的文件才能包含在內。

延伸閱讀:

+0

目前正在閱讀手冊....謝謝 – littlechad 2010-09-07 08:08:59

+0

很多家庭工作要做,感謝這個有價值的信息 – littlechad 2010-09-07 17:26:00

1

這是可能的,但不推薦,就像如果有人能在該目錄中創建一個PHP文件是什麼,你最終會包括它,此外,你無法預測包含順序。

試試這個:

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

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

} 

如果你使用類,可以考慮使用自動加載,如@Gordon建議。如果你不使用類,請考慮使用它們:)

+0

+1無法預測列入順序。 – janosrusiczki 2010-09-07 08:07:58

+0

同樣的問題要求@NullUserException;所以最好的做法是,我應該堅持我目前正在做的事情(編輯first_run.php,如果新文件被創建)? – littlechad 2010-09-07 08:09:49

+0

如果這些文件包含類,最好的方法是使用自動加載,如果它們中的一些包含某些設置或基類(使用_always_的)。我相信你最初發布的代碼是最好的方式,我發佈的方式會盡量減少代碼,並使添加新的包含文件更快一些,以演示如何完成這樣的事情,但這不是更好:) – aularon 2010-09-07 08:22:25

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); 
} 
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);