В системе, которую мы будем использовать, есть функция, называемая «uses». Если вы знакомы с pascal, предложение uses - это то, где вы сообщаете своей программе, какие зависимости у него есть (аналогично C и PHP). Эта функция используется для дальнейшего управления включением файлов, кроме include (_once) или require (_once).PHP Постоянный токен параметров строки
Как часть процедур тестирования, мне нужно написать средство визуализации зависимостей для статически загружаемых файлов.
нагруженный Пример Статический: 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
является лучшим в этом случае. Так что, может быть, проблема в том, что мой механизм состояния действительно не так хорош. Возможно, мне не хватало простого выхода, подумал, что я получу отзыв о нем.
Редактировать: Я принял подход, объяснив, что я делаю на этот раз, но не совсем то, что я хочу. Проще говоря, мне нужно получить массив аргументов, передаваемых функции с именем «uses». Дело в том, что я немного разбираюсь в аргументах; Мне нужен только массив прямых строк, никакого динамического кода вообще (константы, переменные, вызовы функций ...).
Могу я спросить, почему бы просто не использовать автозагрузку классов? – Mchl
Действительно, забудьте о регулярном выражении = evil mem. Это ** является прецедентом для них. – mario
@Mchl - Потому что это не относится конкретно к классам. @Mario - По общему признанию, я не так хорош с регулярными выражениями. В любом случае, я regex для синтаксического анализа PHP-кода было бы сложно создать и поддерживать, а также довольно медленно запускать. – Christian