Если вы просто хотите проверить файл без загрузки его использования token_get_all()
:
<?php
header('Content-Type: text/plain');
$php_file = file_get_contents('c2.php');
$tokens = token_get_all($php_file);
$class_token = false;
foreach ($tokens as $token) {
if (is_array($token)) {
if ($token[0] == T_CLASS) {
$class_token = true;
} else if ($class_token && $token[0] == T_STRING) {
echo "Found class: $token[1]\n";
$class_token = false;
}
}
}
?>
В принципе, это просто конечный автомат. В PHP последовательность tokens будет:
T_CLASS
: 'класс' ключевое слово;
T_WHITESPACE
: space (s) after 'class';
T_STRING
: название класса.
Так что этот код будет обрабатывать любые странные интервалы или новые строки, которые вы получите просто отлично, потому что он использует тот же парсер, который использует PHP для выполнения файла. Если token_get_all()
не может его разобрать, ни PHP не может.
Кстати, вы используете token_name()
, чтобы превратить номер токена в его постоянное имя.
Вот мой c2.php:
<?php
class MyClass {
public __construct() {
}
}
class MyOtherClass {
public __construct() {
}
}
?>
Выход:
Found class: MyClass
Found class: MyOtherClass
Какова цель получения имени класса для каждого файла? Лучшее решение должно быть адаптировано под ваше проблемное пространство. В его нынешнем виде я чувствую, что, вероятно, лучшее решение в зависимости от того, что вы хотите сделать. –
Прошло некоторое время, но все же: вы могли бы вызвать 'get_declared_classes', сохранить его, включить файл класса и снова вызвать' get_declared_classes'. Разница в этом файле. Просто. – Rudie