Ich versuche, den Tokenizer zu verwenden, um eine Datei zu durchsuchen, um alle definierten Klassen, alles, was sie erweitern, alle erstellten Instanzen und wann immer sie statisch aufgerufen wurden, zu finden.Wie finde ich alle in einer PHP-Datei verwendeten Klassen?
<?php
$tokens = token_get_all(file_get_contents($file));
$used_classes = array();
$defined_classes = array();
$variable_classes = array();
foreach($tokens as $i => $token) {
if(is_array($token)) {
if(isset($tokens[$i - 2][0], $tokens[$i - 1][0])) {
// new [class]
if ($tokens[$i - 2][0] == T_NEW AND $tokens[$i - 1][0] == T_WHITESPACE) {
if($tokens[$i][0] == T_STRING) {
$used_classes[$token[1]] = TRUE;
// new $variable()
} elseif($tokens[$i][0] == T_VARIABLE) {
// @todo, this is really broken. However, do best to look for the assignment
if(preg_match('~\$var\s*=\s*([\'"])((?:(?!\1).)*)\1~', $text, $match)) {
if(empty($extension_classes[$match[2]])) {
$used_classes[$match[2]] = TRUE;
}
} elseif($token[1] !== '$this') {
$variable_classes[$token[1]] = TRUE;
}
}
}
// class [class]
if ($tokens[$i - 2][0] == T_CLASS AND $tokens[$i - 1][0] == T_WHITESPACE) {
if($tokens[$i][0] == T_STRING) {
$defined_classes[$token[1]] = TRUE;
}
}
// @todo: find more classes \/
// class [classname] extends [class] ???
// [class]::method()???
}
}
}
Wie kann ich diesen Code erweitern, um zusätzliche Instanzen von PHP-Klassen wie oben erwähnt zu finden?
- http://www.php.net/manual/en/tokens.php
- http://westhoffswelt.de/blog/class_dependency_graph_generation_update.html
- http://phpqatools.org/
In PHP gibt es eine magische Konstante __ FILE __ (ohne Leerzeichen). Du kannst diese Datei öffnen (fopen oder file_get_contents) und sie über preg_match (sowas wie /^\s*class(.*)$/ und /(.*)::(.*)/ und so) suchen. Kenne diese ziemlich nicht-straigh Lösung, also wird vielleicht jemand einen besseren finden. Wenn Sie alle Klassen finden möchten, können Sie die Funktion get_declared_classes (http://php.net/manual/en/function.get-declared-classes.php) und so verwenden, aber denken Sie daran, dass auch Kern-Klassen enthalten sind. – tomis
Von Ihren drei Empfehlungen hat nur die Suche mit Regex etwas mit der statischen Analyse von PHP-Code zu tun. Allerdings würde ich lieber Regex vermeiden, da der PHP-Parser vertrauenswürdiger ist. Ich kann mir auch nicht vorstellen, wie komplex die Regex sein müsste, um eine variable Variable zu finden. – Xeoncross
Nun, ich fürchte, dass die vollständige Füllung, die Sie anfordern (Klassendefinition und Aufrufe in der Zieldatei), nicht möglich ist ... – tomis