В системе, которую мы будем использовать, есть функция, которая называется «использует». Если вы знакомы с pascal, в разделе метки использования вы указываете своей программе, какие у нее зависимости (аналогично C и PHP).
Эта функция используется для дальнейшего управления включением файлов, кроме include (_once) или require (_once).
В рамках процедур тестирования мне нужно написать инструмент визуализации зависимостей для статически загружаемых файлов.
Статически загруженный пример: uses('core/core.php','core/security.php');
Пример с динамической загрузкой: uses('exts/database.'.$driver.'.php');
Мне нужно отфильтровать случаи динамической загрузки, потому что код тестируется статически, а не во время работы.
Это код, который я сейчас использую:
$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]);
}
Примечание. Может быть полезно узнать, что я использую движок состояний для определения аргументов.
Моя проблема? Поскольку в функцию могут входить всевозможные аргументы, очень трудно сделать это правильно.
Возможно, я не использую правильный подход, но я уверен, что использование token_get_all
является лучшим в этом случае. Так что, возможно, проблема в моем государственном двигателе, который на самом деле не так хорош.
Возможно, я упустил легкий выход, подумал, что получу некоторую экспертную оценку.
Редактировать: Я попытался объяснить, что я делаю в этот раз, но не совсем то, что я хочу.
Проще говоря, мне нужно получить массив аргументов, передаваемых в функцию с именем «использует». Дело в том, что я немного конкретен в аргументах; Мне нужен только массив прямых строк, вообще никакого динамического кода (константы, переменные, вызовы функций ...).