Разбор классов, функций и аргументов в PHP

Я хочу создать функцию, которая получает один аргумент, который содержит путь к файлу PHP, а затем анализирует данный файл и возвращает что-то вроде этого:

class NameOfTheClass function Method1($arg1, $arg2, $arg2) private function Method2($arg1, $arg2, $arg2) public function Method2($arg1, $arg2, $arg2) abstract class AnotherClass function Method1($arg1, $arg2, $arg2) private function Method2($arg1, $arg2, $arg2) public function Method2($arg1, $arg2, $arg2) function SomeFunction($arg1, $arg2, $arg3) 

Эта функция должна возвращать все классы, методы и функции, которые существуют в данном файле со всеми определенными идентификаторами (абстрактными, общедоступными, частными, защищенными, статическими, расширяемыми, интерфейсами, …).

Моей первой задачей было использовать регулярные выражения для этого, однако они очень плохо относятся к комментариям, т. Е. / * Эта функция возвращает (max (зарплата)) * / и становится довольно сложной, если я хочу правильно поддерживать области.

Другим возможным решением было использование следующих встроенных функций PHP:

 get_declared_classes get_declared_interfaces get_defined_functions get_class_methods 

Однако эти функции не позволяют мне видеть файл, где определены классы / методы / функции, и, следовательно, это не очень полезно.

Я считаю, что расширение Tokenizer является решением для моей проблемы, однако я никогда раньше не использовал это расширение.

    Если вы используете PHP 5, Reflect API – это ваш инструмент.

    Пример:

     $class = new ReflectionClass("NameOfTheClass"); $methods = $class->getMethods(); foreach($methods as $m) { print $m->name; $m->isPrivate() ? print "Private" : print ""; $m->isPublic() ? print "Public" : print ""; $params = $m->getParameters(); foreach($params as $p) { print $p->getName(); } } 

    Я предлагаю следующую процедуру:

    1. сохранить текущий вывод get_declared_classes , get_declared_interfaces и get_defined_functions (если вам действительно нужно их поддерживать)
    2. включить файл
    3. сравните get_declared_classes , get_declared_interfaces и g et_defined_functions с теми, которые вы сохранили, чтобы посмотреть, что нового
    4. использовать отражение для их анализа
    5. Перейти к шагу 2 для следующего файла

    Как вы сами узнали, регулярное выражение – не совсем правильный инструмент для работы, здесь ^^

    И, как вы сказали, встроенные функции, которые вы предложили, также не очень полезны – единственное, что может быть полезно, это то, что они позволяют вам узнать, какой класс существует … Но они также вернут встроенные классы 🙁

    Использование расширения Tokenizer кажется немного переполненным / трудным для меня; Я бы, вероятно, не пошел так, на самом деле: слишком «низкоуровневый», я полагаю.

    Вместо этого я хотел бы взглянуть на PHP Reflection API : он существует именно для обратного проектирования классов, интерфейсов, функций, …

    Поэтому, я полагаю, это было бы очень хорошо для того, что вы пытаетесь сделать.

    Изменить: вот краткий пример:

    Во-первых, давайте попробуем сделать размышления над классом:

     include dirname(__FILE__) . '/temp-2.php'; $rC = new ReflectionClass('MyFirstClass'); 

    Теперь вы можете узнать, в каком файле он был объявлен, и какие методы в нем:

     var_dump($rC->getFileName()); var_dump($rC->getMethods()); 

    Который доставит вас:

     string '/home/squale/developpement/tests/temp/temp-2.php' (length=48) array 0 => & object(ReflectionMethod)[2] public 'name' => string '__construct' (length=11) public 'class' => string 'MyFirstClass' (length=12) 1 => & object(ReflectionMethod)[3] public 'name' => string 'glop' (length=4) public 'class' => string 'MyFirstClass' (length=12) 

    И теперь, чтобы получить информацию по каждому методу:

     foreach ($rC->getMethods() as $rM) { var_dump($rM, $rM->getParameters()); echo '-----'; } 

    Ты получишь :

     object(ReflectionMethod)[3] public 'name' => string '__construct' (length=11) public 'class' => string 'MyFirstClass' (length=12) array 0 => & object(ReflectionParameter)[4] public 'name' => string 'arg1' (length=4) 1 => & object(ReflectionParameter)[5] public 'name' => string 'arg2' (length=4) ----- object(ReflectionMethod)[2] public 'name' => string 'glop' (length=4) public 'class' => string 'MyFirstClass' (length=12) array 0 => & object(ReflectionParameter)[5] public 'name' => string 'a' (length=1) 

    Оттуда, вы должны быть в состоянии копать немного больше; и приходите к тому, что вы впервые задали 😉

    В качестве опоры: есть одна вещь, о которой я понятия не имею, есть: « как найти, какие классы / методы объявлены в данном файле » 🙁

    Если у кого-то есть идея, это будет приветствоваться!

    Я не могу помочь вам с вашим конкретным вопросом, поскольку я никогда не использовал Tokenizer.

    Вы не упомянули, для чего вы это используете, но что-то вроде phpDoc сделает то, что вам нужно?