In einem System, das wir verwenden werden, gibt es eine Funktion namens "verwendet". Wenn Sie mit pascal vertraut sind, gibt die uses-Klausel Ihrem Programm an, welche Abhängigkeiten es hat (ähnlich wie C und PHP). Diese Funktion wird verwendet, um die Dateieinfügung mit Ausnahme von include (_once) oder require (_once) weiter zu steuern.PHP Konstante Zeichenfolge Parameter Token
Als Teil der Testverfahren muss ich ein Abhängigkeits-Visualisierungstool für statisch geladene Dateien schreiben.
Statisch Loaded Beispiel: uses('core/core.php','core/security.php');
dynamisch nachgeladen Beispiel: uses('exts/database.'.$driver.'.php');
Ich brauche dynamische Lastfälle, um herauszufiltern, da der Code statisch getestet wird, nicht während des Betriebs.
Dies ist der Code, den ich zu diesem Zeitpunkt bin mit:
$inuses=false; // whether currently in uses function or not
$uses=array(); // holds dependencies (line=>file)
$tknbuf=array(); // last token
foreach(token_get_all(file_get_contents($file)) as $token){
// detect uses function
if(!$inuses && is_array($token) && $token[0]==T_STRING && $token[1]=='uses')$inuses=true;
// detect uses argument (dependency file)
if($inuses && is_array($token) && $token[0]==T_CONSTANT_ENCAPSED_STRING)$tknbuf=$token;
// detect the end of uses function
if($inuses && is_string($token) && $token==')'){
$inuses=false;
isset($uses[$tknbuf[2]])
? $uses[$tknbuf[2]][]=$tknbuf[1]
: $uses[$tknbuf[2]]=array($tknbuf[1]);
}
// a new argument (dependency) is found
if($inuses && is_string($token) && $token==',')
isset($uses[$tknbuf[2]])
? $uses[$tknbuf[2]][]=$tknbuf[1]
: $uses[$tknbuf[2]]=array($tknbuf[1]);
}
Hinweis: Es kann helfen, zu wissen, dass ich einen Zustand Motor bin mit den Argumenten zu erkennen.
Mein Problem? Da es alle möglichen Argumente gibt, die in der Funktion vorkommen können, ist es sehr schwierig, es richtig zu machen. Vielleicht verwende ich nicht den richtigen Ansatz, aber ich bin mir ziemlich sicher, token_get_all
ist in diesem Fall das beste. Vielleicht ist das Problem meine State Engine, die wirklich nicht so gut ist. Ich könnte den einfachen Ausweg vermissen, dachte, ich würde ein paar Peer Review davon bekommen.
Bearbeiten: Ich nahm den Ansatz zu erklären, was ich diesmal mache, aber nicht genau das, was ich will. In einfachen Worten, ich muss ein Array der Argumente erhalten, die an eine Funktion namens "verwendet" übergeben werden. Die Sache ist, ich bin ein bisschen spezifisch in Bezug auf die Argumente; Ich brauche nur eine Reihe von geraden Strings, keinen dynamischen Code (Konstanten, Variablen, Funktionsaufrufe ...).
Darf ich fragen, warum nicht einfach Autoloading von Klassen verwenden? – Mchl
Wirklich, vergiss die Regex = böses Meme. Das ** ist ** ein Anwendungsfall für sie. – mario
@Mchl - Weil dies nicht speziell Klassen betrifft. @ Mario - Zugegeben, ich bin nicht so gut mit Regexes. In jedem Fall, ich Regex PHP-Code zu analysieren wäre schwer zu erstellen und zu pflegen sowie ziemlich langsam zu laufen. – Christian