/ / Gestione delle dipendenze / percorso PHP - php, dipendenze, percorso classe

Gestione delle dipendenze e del percorso di classe PHP - php, dipendenze, percorso di classe

Una cosa che spesso mi disturba è che non lo faccioavere un percorso di classe e un sistema di gestione delle dipendenze in PHP. C'è un framework che puoi suggerire? Ho sentito che Pear è un buon sistema da esaminare ma mi piacerebbe sapere cos'altro c'è.

Un esempio potrebbe essere dire ... Ho i file A.php, B.php e C.php dove A dipende da B che dipende da C. dove tutti e 3 sono in cartelle diverse.

Quindi, una volta che A.php include B.php, deve anche includere C.php. Digitare request_once ("C.php") in B.php non funzionerebbe perché il request_once deve chiamare un percorso relativo tra A.php e C.php e non tra B.php e C.php, il che è fastidioso.

risposte:

3 per risposta № 1

Per questo problema tendo a preferire un caricatore automatico. Non è difficile creare uno script robusto per scansionare alcuni file e creare un elenco di classi mappate su file da essi. Ecco come lo faccio:

$classes = array();

//this is the main function, give it a file and it will map any
//classes it finds in the file to the path. How you find the files
//is up to you, only you know your directory structure, but I
//generally set up a few folders that hold my classes, and have
//the script recurse through those passing each file it finds through
//this function
function get_php_classes($file) {
global $classes;
$php_code = file_get_contents($file);
$tokens = token_get_all($php_code);
$count = count($tokens);

//uses phps own parsing to figure out classes
//this has the advantage of being able to find
//multiple classes contained in one file
for ($i = 2; $i < $count; $i++) {
if (   $tokens[$i - 2][0] == T_CLASS
&& $tokens[$i - 1][0] == T_WHITESPACE
&& $tokens[$i][0] == T_STRING) {

$class_name = $tokens[$i][1];
//now we map a class to a file ie "Autoloader" => "C:projectAutoloader.cls.php"
$classes[$class_name] = $file;
}
}
}

$fh = fopen("file_you_want_write_map_to", "w");
fwrite($fh, serialize($classes));
fclose($fh);

Questo è lo script che genera i mapping dei file, lo si esegue una volta ogni volta che si aggiunge una nuova classe. Ecco il codice dell'applicazione che può essere utilizzato per caricare automaticamente:

class Autoloader {
private $class_map;

public function __construct() {

//you could also move this out of the class and pass it in as a param
$this->class_map = unserialize(file_get_contents($file_you_wrote_to_earlier));
spl_autoload_register(array($this, "load"));
}

private function load($className) {
//and now that we did all that work in the script, we
//we just look up the name in the map and get the file
//it is found in
include $this->class_map[$className];
}
}

C'è molto di più che si potrebbe fare con questo,vale a dire il controllo di sicurezza per varie cose come le classi duplicate trovate durante la creazione dell'elenco di caricamento automatico, assicurandosi che i file esistano prima di provare a includerli, ecc.


2 per risposta № 2

Ti suggerisco di provare il progetto caricatore di classi di dottrina.

Qui puoi trovare la documentazione ufficiale.

Per usare questa libreria, hai bisogno di una versione di php che abbia il supporto dello spazio dei nomi (quindi> = 5.3)


1 per risposta № 3

Il compositore è dove sta andando tutto e fa tutto questo per te abbastanza facilmente

http://getcomposer.org/