Я хочу создать функцию, которая получает один аргумент, который содержит путь к файлу 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(); } }
Я предлагаю следующую процедуру:
get_declared_classes
, get_declared_interfaces
и get_defined_functions
(если вам действительно нужно их поддерживать) get_declared_classes
, get_declared_interfaces
и g et_defined_functions
с теми, которые вы сохранили, чтобы посмотреть, что нового Как вы сами узнали, регулярное выражение – не совсем правильный инструмент для работы, здесь ^^
И, как вы сказали, встроенные функции, которые вы предложили, также не очень полезны – единственное, что может быть полезно, это то, что они позволяют вам узнать, какой класс существует … Но они также вернут встроенные классы 🙁
Использование расширения 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 сделает то, что вам нужно?