/ / PHP зависимост и управление на classpath - php, зависимости, classpath

PHP зависимост и управление на classpath - php, зависимости, classpath

Едно нещо, което често ме притеснява, е, че не го правяимат система за управление на пътя и зависимостта в PHP. Има ли рамка, която можете да предложите? Чух, че Pear е добра система за проучване, но бих искал да знам какво още има.

Пример може да се каже ... Имам файлове A.php, B.php и C.php, където A зависи от B, който зависи от C. където всички 3 са в различни папки.

Така веднъж A.php включва Б.php, той също трябва да включва C.php. Въвеждането на Requ_once ("C.php") в B.php няма да работи, тъй като Requ_once трябва да извика относителен път между A.php и C.php, а не между B.php и C.php, което е досадно.

Отговори:

3 за отговор № 1

За този проблем предпочитам да се зареди с автоматично зареждане. Не е трудно да се направи стабилен скрипт, който да сканира някои файлове и да състави списък от класове, картографирани във файлове от тях. Ето как го правя:

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

Това е скриптът, който генерира картографирането на файловете, стартирайте го веднъж по всяко време, когато добавите нов клас. Ето действителния код на приложението, който може да се използва за автоматично зареждане:

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

Има много повече неща, които могат да се направят с това,а именно проверка на безопасността за различни неща, като дублирани класове, открити при съставяне на списъка за автоматично зареждане, като се уверите, че съществуват файлове, преди да се опитате да ги включите и т.н.


2 за отговор № 2

Предлагам ви да изпробвате проекта за зареждане на доктрина клас.

Тук можете да намерите официалната документация.

За да използвате тази библиотека, се нуждаете от версия на php, която поддържа поддръжка на пространство от имена (тогава> = 5.3)


1 за отговор № 3

Композиторът е там, където върви всичко и прави всичко това за вас съвсем удобно

http://getcomposer.org/