PHP API
Greph\Greph
Клас Greph\Greph — це статична точка входу. Він надає всі операції пошуку, перезапису та індексування. Усі методи приймають один шлях або список шляхів.
use Greph\Greph;
walk
public static function walk(string|array $paths, ?WalkOptions $options = null): FileList
Перетворює $paths на плаский FileList абсолютних шляхів до файлів. Враховує gitignore, .grephignore, фільтри типів файлів, шаблони glob, включення прихованих файлів, перехід за символічними посиланнями, виявлення бінарних файлів і обмеження максимального розміру файлу.
use Greph\Walker\WalkOptions;
use Greph\Walker\FileTypeFilter;
$files = Greph::walk('src', new WalkOptions(
fileTypeFilter: new FileTypeFilter(['php']),
));
foreach ($files->paths() as $path) {
echo "$path\n";
}
searchText
public static function searchText(
string $pattern,
string|array $paths,
?TextSearchOptions $options = null,
): array
Виконує текстовий пошук і повертає list<TextFileResult>. Кожен TextFileResult містить шлях до файлу та список об'єктів TextMatch (рядок, стовпець, вміст, захоплені значення, необов'язковий контекст).
use Greph\Greph;
use Greph\Text\TextSearchOptions;
$results = Greph::searchText(
'function',
'src',
new TextSearchOptions(
fixedString: true,
caseInsensitive: true,
beforeContext: 1,
afterContext: 1,
jobs: 4,
),
);
foreach ($results as $file) {
foreach ($file->matches as $match) {
echo "{$file->file}:{$match->line}:{$match->content}\n";
}
}
Якщо встановлено jobs > 1 і кількість файлів перевищує поріг для воркерів, searchText автоматично передає сканування WorkerPool. Інакше воно виконується в тому самому процесі.
searchAst
public static function searchAst(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
): array
Виконує структурний пошук AST і повертає list<AstMatch>. Шаблони записуються вихідним кодом PHP із метазмінними $VAR і $$$VARIADIC. Кожен AstMatch містить файл, захоплений PhpParser\Node, захоплені значення, початковий і кінцевий рядки та зміщення в байтах, а також фрагмент вихідного коду, що відповідає шаблону.
use Greph\Greph;
use Greph\Ast\AstSearchOptions;
$matches = Greph::searchAst(
'new $CLASS()',
'src',
new AstSearchOptions(),
);
foreach ($matches as $match) {
echo "{$match->file}:{$match->startLine}:{$match->code}\n";
}
rewriteAst
public static function rewriteAst(
string $searchPattern,
string $rewritePattern,
string|array $paths,
?AstSearchOptions $options = null,
): array
Виконує структурний перезапис і повертає list<RewriteResult>. Кожен RewriteResult містить шлях до файлу, початковий вміст, переписаний вміст і кількість замін. Формат зберігається: замінюються лише ділянки вузлів, що відповідають шаблону; решта файлу лишається без змін.
$rewrites = Greph::rewriteAst(
'array($$$ITEMS)',
'[$$$ITEMS]',
'src',
);
foreach ($rewrites as $result) {
if ($result->changed()) {
file_put_contents($result->file, $result->rewrittenContents);
}
}
Фасад не записує зміни на диск; викликач сам вирішує, чи застосовувати їх. CLI застосовує їх, якщо не встановлено --dry-run або --interactive.
Індексований текстовий пошук
buildTextIndex
public static function buildTextIndex(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): IndexBuildResult
Створює новий індекс триграм і входжень ідентифікаторів для $rootPath. Індекс зберігається в $indexPath (за замовчуванням — $rootPath/.greph-index). $lifecycle може бути static, manual-refresh, opportunistic-refresh або strict-stale-check. Повертає IndexBuildResult із кількістю файлів і триграм, а також кількістю доданих, оновлених, видалених і незмінених записів.
refreshTextIndex
public static function refreshTextIndex(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): IndexBuildResult
Поетапно оновлює наявний текстовий індекс. Файли повторно хешуються, і переписуються лише змінені записи.
searchTextIndexed
public static function searchTextIndexed(
string $pattern,
string|array $paths,
?TextSearchOptions $options = null,
?string $indexPath = null,
): array
Виконує текстовий пошук у попередньо створеному індексі. Якщо індексу немає, повертає помилку під час виконання (спочатку викличте buildTextIndex). Повертає list<TextFileResult> тієї самої структури, що й searchText.
Greph::buildTextIndex('.');
$results = Greph::searchTextIndexed('function', 'src');
searchTextIndexedMany
public static function searchTextIndexedMany(
string $pattern,
string|array $paths,
array $indexPaths,
?TextSearchOptions $options = null,
): array
Виконує текстовий пошук у попередньо створених індексах кількох каталогів. Greph шукає в кожному відповідному індексі, усуває дублікати за абсолютним шляхом до файлу й запускає звичайне сканування лише для шляхів, що не належать до жодного з указаних кореневих каталогів індексів.
loadIndexSet
public static function loadIndexSet(?string $manifestPath = null): IndexSet
Завантажує маніфест набору індексів; за замовчуванням — .greph-index-set.json у поточному робочому каталозі.
searchTextIndexedSet
public static function searchTextIndexedSet(
string $pattern,
string|array $paths,
?TextSearchOptions $options = null,
?string $manifestPath = null,
array $entryNames = [],
): array
Визначає вибрані записи text з маніфесту набору індексів і виконує еквівалент searchTextIndexedMany.
Індексований пошук AST
buildAstIndex / refreshAstIndex
public static function buildAstIndex(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstIndexBuildResult
public static function refreshAstIndex(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstIndexBuildResult
Створює або поетапно оновлює індекс фактів AST. За замовчуванням зберігає витягнуті факти в $rootPath/.greph-ast-index.
searchAstIndexed
public static function searchAstIndexed(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $indexPath = null,
): array
Використовує індекс фактів для звуження кола кандидатів, а потім повторно перевіряє збіги у вихідному коді. Повертає результат структури list<AstMatch>, як у searchAst.
searchAstIndexedMany
public static function searchAstIndexedMany(
string $pattern,
string|array $paths,
array $indexPaths,
?AstSearchOptions $options = null,
): array
Виконує пошук фактів AST у попередньо створених індексах кількох каталогів.
searchAstIndexedSet
public static function searchAstIndexedSet(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $manifestPath = null,
array $entryNames = [],
): array
Визначає вибрані записи ast-index з маніфесту набору індексів і виконує еквівалент searchAstIndexedMany.
buildAstCache / refreshAstCache
public static function buildAstCache(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstCacheBuildResult
public static function refreshAstCache(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): AstCacheBuildResult
Створює або поетапно оновлює сховище кешованих синтаксичних дерев. За замовчуванням зберігає серіалізовані дерева в $rootPath/.greph-ast-cache.
searchAstCached
public static function searchAstCached(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $indexPath = null,
): array
Виконує пошук AST у кешованих синтаксичних деревах, повністю пропускаючи синтаксичний аналізатор. Повертає результат структури list<AstMatch>, як у searchAst.
searchAstCachedMany
public static function searchAstCachedMany(
string $pattern,
string|array $paths,
array $indexPaths,
?AstSearchOptions $options = null,
): array
Виконує пошук AST у попередньо створеному кеші кількох каталогів.
searchAstCachedSet
public static function searchAstCachedSet(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $manifestPath = null,
array $entryNames = [],
): array
Визначає вибрані записи ast-cache з маніфесту набору індексів і виконує еквівалент searchAstCachedMany.
Greph\Text\TextSearchOptions
Об'єкт параметрів лише для читання для текстового пошуку.
new TextSearchOptions(
bool $fixedString = false,
bool $caseInsensitive = false,
bool $wholeWord = false,
bool $invertMatch = false,
?int $maxCount = null,
int $beforeContext = 0,
int $afterContext = 0,
bool $countOnly = false,
bool $filesWithMatches = false,
bool $filesWithoutMatches = false,
bool $jsonOutput = false,
bool $tracePlan = false,
int $jobs = 1,
bool $respectIgnore = true,
bool $includeHidden = false,
bool $followSymlinks = false,
bool $skipBinaryFiles = true,
bool $includeGitDirectory = false,
?FileTypeFilter $fileTypeFilter = null,
int $maxFileSizeBytes = 10485760,
array $globPatterns = [],
bool $showLineNumbers = true,
bool $showFileNames = true,
)
Перевірка:
jobs >= 1beforeContext, afterContext >= 0maxCount === null || maxCount >= 1
Скористайтеся walkOptions(), щоб визначити відповідний WalkOptions, якщо хочете окремо обійти дерево файлів.
tracePlan використовують засоби пошуку в попередньо створеному індексі, а потоки greph-index CLI — щоб виводити діагностику планувальника в stderr. Сам звичайний searchText його не використовує.
Greph\Ast\AstSearchOptions
Об'єкт параметрів лише для читання для пошуку й перезапису AST.
new AstSearchOptions(
string $language = 'php',
int $jobs = 1,
bool $respectIgnore = true,
bool $includeHidden = false,
bool $followSymlinks = false,
bool $skipBinaryFiles = true,
bool $includeGitDirectory = false,
?FileTypeFilter $fileTypeFilter = null,
int $maxFileSizeBytes = 10485760,
array $globPatterns = [],
bool $skipParseErrors = true,
bool $dryRun = false,
bool $interactive = false,
bool $jsonOutput = false,
bool $tracePlan = false,
)
Фільтр типів файлів за замовчуванням для режиму AST — php. Якщо skipParseErrors має значення true (за замовчуванням), файли, які не вдалося розібрати, мовчки пропускаються; змініть значення на false, щоб помилки розбору спричиняли винятки. tracePlan використовують засоби пошуку AST у попередньо створених індексах, а greph-index ast-index|ast-cache search — для виведення діагностики відсікання кандидатів.
Greph\Walker\WalkOptions
Об'єкт параметрів лише для читання для обходу файлів.
new WalkOptions(
bool $respectIgnore = true,
bool $includeHidden = false,
bool $followSymlinks = false,
bool $skipBinaryFiles = false,
bool $includeGitDirectory = false,
?FileTypeFilter $fileTypeFilter = null,
int $maxFileSizeBytes = 10485760,
array $globPatterns = [],
)
Greph\Walker\FileTypeFilter
Перетворює імена типів файлів на списки розширень. Вбудовані псевдоніми:
| Псевдонім | Розширення |
|---|---|
css |
css, sass, scss |
html |
htm, html, phtml |
js |
cjs, js, mjs |
json |
json |
md |
markdown, md |
php |
inc, php, php3, php4, php5, php7, php8, phpt, phtml |
txt |
txt |
ts |
ts, tsx |
xml |
xml |
yaml |
yaml, yml |
new FileTypeFilter(includeTypes: ['php'], excludeTypes: ['md']);
Об'єкти результатів
Greph\Text\TextFileResult
final readonly class TextFileResult
{
public string $file;
/** @var list<TextMatch> */
public array $matches;
public function matchCount(): int;
public function hasMatches(): bool;
}
Greph\Text\TextMatch
final readonly class TextMatch
{
public string $file;
public int $line;
public int $column;
public string $content;
public string $matchedText;
/** @var array<int|string, string> */
public array $captures;
/** @var list<array{line: int, content: string}> */
public array $beforeContext;
/** @var list<array{line: int, content: string}> */
public array $afterContext;
}
Greph\Ast\AstMatch
final readonly class AstMatch
{
public string $file;
public PhpParser\Node $node;
/** @var array<string, mixed> */
public array $captures;
public int $startLine;
public int $endLine;
public int $startFilePos;
public int $endFilePos;
public string $code;
}
Greph\Ast\RewriteResult
final readonly class RewriteResult
{
public string $file;
public string $originalContents;
public string $rewrittenContents;
public int $replacementCount;
public function changed(): bool;
}
Greph\Index\IndexBuildResult
final readonly class IndexBuildResult
{
public string $rootPath;
public string $indexPath;
public int $fileCount;
public int $trigramCount;
public int $addedFiles;
public int $updatedFiles;
public int $deletedFiles;
public int $unchangedFiles;
}
AstIndexBuildResult і AstCacheBuildResult мають однакову структуру, де factCount і cachedTreeCount відповідно замінюють одне одного.
Винятки
Greph викидає три типізовані винятки, усі в Greph\Exceptions:
| Виняток | Коли виникає |
|---|---|
WalkerException |
Помилки файлової системи під час обходу (відсутній шлях, каталог недоступний для читання) |
PatternException |
Некоректний регулярний вираз або шаблон AST |
ParseException |
Не вдалося розібрати вихідний код PHP (лише коли skipParseErrors: false) |
Методи індексованого пошуку викидають \RuntimeException, якщо індексу немає у вказаному розташуванні. greph-index CLI надає параметр --fallback scan, який перехоплює ці винятки й натомість запускає сканування без індексу.