/ / PHP dependência e gerenciamento de caminho de classe - php, dependências, caminho de classe

Gerenciamento de dependência e classpath em PHP - php, dependencies, classpath

Uma coisa que muitas vezes me incomoda é que eu nãoter um caminho de classe e sistema de gerenciamento de dependência em PHP. Existe uma estrutura que você pode sugerir? Ouvi dizer que Pear é um bom sistema para investigar, mas gostaria de saber o que mais existe.

Um exemplo seria dizer ... Eu tenho os arquivos A.php, B.php e C.php, onde A depende de B, que depende de C., onde todos os 3 estão em pastas diferentes.

Então, uma vez que A.php inclua B.php, ele também precisa incluir C.php. Digitar require_once ("C.php") em B.php não funcionaria porque o require_once deve chamar um caminho relativo entre A.php e C.php e não entre B.php e C.php, o que é irritante.

Respostas:

3 para resposta № 1

Para este problema, eu tendem a preferir um carregador automático. Não é difícil criar um script robusto para verificar alguns arquivos e criar uma lista de classes mapeadas para arquivos a partir deles. Veja como eu faço isso:

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

Esse é o script que gera os mapeamentos de arquivos, você o executa uma vez sempre que adicionar uma nova classe. Aqui está o código real do aplicativo que pode ser usado para carregar 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];
}
}

Há muito mais que poderia ser feito com isso,ou seja, verificação de segurança para várias coisas, como classes duplicadas encontradas ao criar a lista de carregamento automático, certificando-se de que os arquivos existam antes de tentar incluí-los etc.


2 para resposta № 2

Eu sugiro que você tente o projeto do carregador de classes de doutrina.

Aqui você pode encontrar a documentação oficial.

Para usar esta biblioteca, você precisa de uma versão do php que suporte o namespace (então> = 5.3)


1 para resposta № 3

Compositor é onde tudo está indo, e faz tudo isso para você com bastante facilidade

http://getcomposer.org/