Domanda

Questa è la mia terza domanda finora su StackOverflow: D

i sto definendo i file e la loro posizione sui miei file first_run.php, i file che definisco ecco quei file che contengono le classi, le funzioni di supporto e qualsiasi altro file necessari

a sviluppo precoce, questo first_run.php contiene solo poche righe di codice ma la linea è in aumento man mano che aggiungo alcune nuove classi o nuovi file da includere

e dal Gruppo I la posizione del file all'interno di una cartella particolare, Figura I che forse posso eseguire la scansione della cartella, mettere il nome dei file recuperati in un array e poi avvolgere il require_once, in modo che non devo modificare first_run. php ogni volta aggiungo un nuovo file all'interno della cartella.

il mio approccio fisrt sta usando scandir ()

prima

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

dopo è qualcosa di simile:

$member_files = scandir(MEMBERS);
foreach($member_files as $member_file):
    require_once(MEMBERS.DS.$member_file);
endforeach;

I havent provare il 'dopo' il codice però. È possibile?? o c'è qualche altro approccio ?? O devo solo lasciare in quel modo (continuare ad aggiungere le righe senza la scansione dei file)

grazie in anticipo

È stato utile?

Soluzione

Si consideri utilizzando Autoloading .

Con caricamento automatico, non si deve perdere tempo con inclusi i file a tutti. Ogni volta che si crea un'istanza di una nuova classe che non è noto a PHP, a quel punto, PHP attiverà la funzione di caricamento automatico registrati. La funzione include i file necessari, allora. In questo modo, si carica solo quello che serve quando ne avete bisogno, che dovrebbe aumentare le prestazioni.

Esempio semplice con PHP5.3

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

Quando si chiama new Foo, la funzione autoload registrato cercherà di includere la classe da /path/to/lib/and/Foo.php. Si consiglia di utilizzare una convenzione nome di classe, come F.I. PEAR , per rendere la ricerca di file più semplice e per ridurre la quantità di include_paths .

Per la sicurezza e la velocità aggiuntiva, è possibile fornire una più sofisticato caricatore automatico che utilizza una matrice per mappare da nomeclasse al nome del file , rendendo così sicuri solo i file che in realtà fanno parte della vostra applicazione può ottenere incluso.

Per ulteriori approfondimenti:

Altri suggerimenti

E 'possibile, ma non è raccomandato, come quello che se qualcuno potrebbe creare un file php in tale directory, vi ritroverete tra cui esso, inoltre, non è possibile prevedere l'ordine di inserimento.

Prova questo, invece:

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

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

}

Se si sta utilizzando classi, considerare l'utilizzo di caricamento automatico, come suggerito @Gordon. E se si werent usando le classi, considerare l'utilizzo di loro:)

A prima vista il vostro codice potrebbe funzionare, anche se bisogna ignorare "" e ".." nel ciclo foreach. In più ho piacerebbe verificare, se le estremità di file con ".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);
}

creare 2 funzioni

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top