Как вы сами узнали, регулярные выражения - совсем не подходящий инструмент для работы, здесь ^^
И, как вы сказали, предложенные вами встроенные функции тоже не очень полезны - единственное, что может быть полезно, это то, что они позволяют вам знать, какой класс существует ... Но они также будут возвращать встроенные классы. : - (
Использование расширения 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)
Оттуда вы сможете больше копать; и получите то, что вы сначала спросили; -)
Как примечание: есть одна вещь, о которой я понятия не имею: « как найти, какие классы / методы объявлены в данном файле »: - (
Если у кого-то есть идея, она будет приветствоваться!