https://github.com/bermudaphp/tokenizer
PHP tokenizer for finding class, interface, trait, and enum declarations.
https://github.com/bermudaphp/tokenizer
parser php php84 tokenization tokenizer
Last synced: 9 months ago
JSON representation
PHP tokenizer for finding class, interface, trait, and enum declarations.
- Host: GitHub
- URL: https://github.com/bermudaphp/tokenizer
- Owner: bermudaphp
- License: mit
- Created: 2025-06-11T12:56:43.000Z (10 months ago)
- Default Branch: master
- Last Pushed: 2025-06-11T13:35:39.000Z (10 months ago)
- Last Synced: 2025-06-11T14:42:22.889Z (10 months ago)
- Topics: parser, php, php84, tokenization, tokenizer
- Language: PHP
- Homepage:
- Size: 68.4 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.RU.md
- License: LICENSE
Awesome Lists containing this project
README
# bermudaphp/tokenizer
[🇺🇸 English](README.md) | 🇷🇺 Русский
Оптимизированный PHP токенизатор для поиска объявлений классов, интерфейсов, трейтов и енумов.
## Особенности
- **Полная поддержка PHP 8+** - работает с классами, интерфейсами, трейтами и енумами
- **Поддержка модификаторов** - abstract, final, readonly классы
- **Игнорирование анонимных классов** - фокус на именованных объявлениях
- **Поддержка атрибутов PHP** - корректная обработка `#[Attribute]`
- **Виртуальные свойства** - удобный доступ к информации о классах
- **Настраиваемый поиск** - битовые флаги для выборочного поиска
## Установка
```bash
composer require bermudaphp/tokenizer
```
## Быстрый старт
```php
parse($source);
foreach ($declarations as $classInfo) {
echo "Найден {$classInfo->type}: {$classInfo->fullQualifiedName}\n";
echo "Пространство имен: {$classInfo->namespace}\n";
echo "Имя класса: {$classInfo->name}\n";
echo "Абстрактный: " . ($classInfo->isAbstract ? 'да' : 'нет') . "\n";
echo "---\n";
}
```
## Режимы поиска
Используйте битовые флаги для настройки типов объявлений для поиска:
```php
// Искать только классы
$classes = $tokenizer->parse($source, TokenizerInterface::SEARCH_CLASSES);
// Искать только интерфейсы и трейты
$interfaces = $tokenizer->parse($source,
TokenizerInterface::SEARCH_INTERFACES | TokenizerInterface::SEARCH_TRAITS
);
// Искать всё (по умолчанию)
$all = $tokenizer->parse($source, TokenizerInterface::SEARCH_ALL);
```
### Доступные флаги
| Константа | Значение | Описание |
|-----------|----------|----------|
| `SEARCH_CLASSES` | 1 | Искать классы |
| `SEARCH_INTERFACES` | 2 | Искать интерфейсы |
| `SEARCH_TRAITS` | 4 | Искать трейты |
| `SEARCH_ENUMS` | 8 | Искать енумы |
| `SEARCH_ALL` | 15 | Искать всё |
## ClassInfo API
Класс `ClassInfo` предоставляет подробную информацию о найденных объявлениях:
### Свойства
```php
$classInfo->fullQualifiedName; // string: Полное квалифицированное имя
$classInfo->type; // string: 'class'|'interface'|'trait'|'enum'
$classInfo->isAbstract; // bool: Абстрактный класс
$classInfo->isFinal; // bool: Финальный класс
$classInfo->isReadonly; // bool: Readonly класс
```
### Виртуальные свойства
```php
$classInfo->name; // string: Имя без пространства имен
$classInfo->namespace; // string: Пространство имен без имени класса
$classInfo->isClass; // bool: Это класс?
$classInfo->isInterface; // bool: Это интерфейс?
$classInfo->isTrait; // bool: Это трейт?
$classInfo->isEnum; // bool: Это енум?
$classInfo->isConcrete; // bool: Конкретный класс (не абстрактный)?
$classInfo->reflector; // ReflectionClass|ReflectionEnum: Рефлектор
```
### Методы
```php
$classInfo->exists(); // bool: Существует ли класс в памяти
```
## Примеры использования
### Поиск конкретных классов
```php
$source = file_get_contents('path/to/file.php');
$declarations = $tokenizer->parse($source, TokenizerInterface::SEARCH_CLASSES);
$concreteClasses = array_filter($declarations, fn($info) => $info->isConcrete);
```
### Работа с рефлекцией
```php
foreach ($declarations as $classInfo) {
if ($classInfo->exists()) {
$reflection = $classInfo->reflector;
echo "Класс {$classInfo->name} имеет " . count($reflection->getMethods()) . " методов\n";
}
}
```
### Группировка по пространствам имен
```php
$byNamespace = [];
foreach ($declarations as $classInfo) {
$byNamespace[$classInfo->namespace][] = $classInfo->name;
}
```
## Требования
- PHP 8.4 или выше
- Расширение `tokenizer` (обычно входит в стандартную сборку PHP)
## Лицензия
MIT License. Подробности в файле [LICENSE](LICENSE).