PHP API
Greph\Greph
Klasa Greph\Greph jest statycznym punktem wejścia. Udostępnia wszystkie operacje wyszukiwania, przepisywania i indeksowania. Wszystkie metody przyjmują pojedynczą ścieżkę lub listę ścieżek.
use Greph\Greph;
walk
public static function walk(string|array $paths, ?WalkOptions $options = null): FileList
Rozwiązuje $paths do płaskiej listy FileList bezwzględnych ścieżek plików. Uwzględnia gitignore, .grephignore, filtry typów plików, wzorce glob, uwzględnianie ukrytych plików, podążanie za dowiązaniami symbolicznymi, wykrywanie plików binarnych oraz limit maksymalnego rozmiaru pliku.
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
Wykonuje wyszukiwanie tekstowe i zwraca list<TextFileResult>. Każdy TextFileResult udostępnia ścieżkę pliku oraz listę obiektów TextMatch (wiersz, kolumna, treść, przechwycone wartości, opcjonalny kontekst).
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";
}
}
Gdy jobs > 1, a liczba plików przekracza próg dla procesów roboczych, searchText automatycznie przekazuje skanowanie do WorkerPool. W przeciwnym razie działa w bieżącym procesie.
searchAst
public static function searchAst(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
): array
Wykonuje strukturalne wyszukiwanie AST i zwraca list<AstMatch>. Wzorce zapisuje się jako kod źródłowy PHP z metavariables $VAR i $$$VARIADIC. Każdy AstMatch zawiera plik, przechwycone PhpParser\Node, przechwycone wartości, numery wierszy i przesunięcia bajtowe początku oraz końca, a także dopasowany fragment kodu źródłowego.
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
Wykonuje strukturalne przepisywanie i zwraca list<RewriteResult>. Każdy RewriteResult udostępnia ścieżkę pliku, oryginalną treść, zmienioną treść i liczbę zamian. Przepisywanie zachowuje format: podmieniane są tylko zakresy dopasowanych węzłów, a reszta pliku pozostaje bez zmian.
$rewrites = Greph::rewriteAst(
'array($$$ITEMS)',
'[$$$ITEMS]',
'src',
);
foreach ($rewrites as $result) {
if ($result->changed()) {
file_put_contents($result->file, $result->rewrittenContents);
}
}
Fasada nie zapisuje zmian na dysku; decyzja o ich zastosowaniu należy do wywołującego. CLI stosuje je, chyba że ustawiono --dry-run lub --interactive.
Indeksowane wyszukiwanie tekstu
buildTextIndex
public static function buildTextIndex(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): IndexBuildResult
Tworzy nowy indeks trygramów i pozycji identyfikatorów dla $rootPath. Indeks jest przechowywany w $indexPath (domyślnie w $rootPath/.greph-index). $lifecycle może mieć wartość static, manual-refresh, opportunistic-refresh lub strict-stale-check. Zwraca IndexBuildResult zawierający liczbę plików i trygramów oraz liczby dodanych, zaktualizowanych, usuniętych i niezmienionych elementów.
refreshTextIndex
public static function refreshTextIndex(
string $rootPath = '.',
?string $indexPath = null,
IndexLifecycle|IndexLifecycleProfile|string|null $lifecycle = null,
): IndexBuildResult
Przyrostowo odświeża istniejący indeks tekstowy. Pliki są ponownie haszowane, a przepisywane są tylko zmienione wpisy.
searchTextIndexed
public static function searchTextIndexed(
string $pattern,
string|array $paths,
?TextSearchOptions $options = null,
?string $indexPath = null,
): array
Wykonuje wyszukiwanie tekstu w rozgrzanym indeksie. Jeśli indeks nie istnieje, zwraca błąd środowiska uruchomieniowego (najpierw wywołaj buildTextIndex). Zwraca list<TextFileResult> o strukturze identycznej z searchText.
Greph::buildTextIndex('.');
$results = Greph::searchTextIndexed('function', 'src');
searchTextIndexedMany
public static function searchTextIndexedMany(
string $pattern,
string|array $paths,
array $indexPaths,
?TextSearchOptions $options = null,
): array
Wykonuje wyszukiwanie tekstu w rozgrzanych indeksach w kilku katalogach. Greph przeszukuje każdy właściwy indeks, usuwa duplikaty na podstawie bezwzględnej ścieżki pliku i uruchamia natywne skanowanie tylko dla ścieżek spoza wszystkich podanych katalogów głównych indeksów.
loadIndexSet
public static function loadIndexSet(?string $manifestPath = null): IndexSet
Wczytuje manifest zestawu indeksów, domyślnie .greph-index-set.json w bieżącym katalogu roboczym.
searchTextIndexedSet
public static function searchTextIndexedSet(
string $pattern,
string|array $paths,
?TextSearchOptions $options = null,
?string $manifestPath = null,
array $entryNames = [],
): array
Rozwiązuje wybrane wpisy text z manifestu zestawu indeksów i uruchamia odpowiednik searchTextIndexedMany.
Indeksowane wyszukiwanie 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
Tworzy indeks faktów AST lub odświeża go przyrostowo. Domyślnie przechowuje wyodrębnione fakty w $rootPath/.greph-ast-index.
searchAstIndexed
public static function searchAstIndexed(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $indexPath = null,
): array
Używa indeksu faktów, aby zawęzić zbiór kandydatów przed ponownym sprawdzeniem dopasowań w kodzie źródłowym. Zwraca wynik o takiej samej strukturze list<AstMatch> jak searchAst.
searchAstIndexedMany
public static function searchAstIndexedMany(
string $pattern,
string|array $paths,
array $indexPaths,
?AstSearchOptions $options = null,
): array
Wykonuje wyszukiwanie faktów AST w rozgrzanych indeksach w kilku katalogach.
searchAstIndexedSet
public static function searchAstIndexedSet(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $manifestPath = null,
array $entryNames = [],
): array
Rozwiązuje wybrane wpisy ast-index z manifestu zestawu indeksów i uruchamia odpowiednik 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
Tworzy magazyn sparsowanych drzew w pamięci podręcznej lub odświeża go przyrostowo. Domyślnie przechowuje serializowane drzewa w $rootPath/.greph-ast-cache.
searchAstCached
public static function searchAstCached(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $indexPath = null,
): array
Wykonuje wyszukiwanie AST w sparsowanych drzewach z pamięci podręcznej, całkowicie pomijając parser. Zwraca wynik o takiej samej strukturze list<AstMatch> jak searchAst.
searchAstCachedMany
public static function searchAstCachedMany(
string $pattern,
string|array $paths,
array $indexPaths,
?AstSearchOptions $options = null,
): array
Wykonuje wyszukiwanie w rozgrzanej pamięci podręcznej AST w kilku katalogach pamięci podręcznej.
searchAstCachedSet
public static function searchAstCachedSet(
string $pattern,
string|array $paths,
?AstSearchOptions $options = null,
?string $manifestPath = null,
array $entryNames = [],
): array
Rozwiązuje wybrane wpisy ast-cache z manifestu zestawu indeksów i uruchamia odpowiednik searchAstCachedMany.
Greph\Text\TextSearchOptions
Niezmienny obiekt opcji wyszukiwania tekstu.
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,
)
Walidacja:
jobs >= 1beforeContext, afterContext >= 0maxCount === null || maxCount >= 1
Użyj walkOptions(), aby wyznaczyć pasujące WalkOptions, jeśli chcesz osobno przejść po drzewie plików.
tracePlan jest używany przez moduły wyszukiwania w rozgrzanym indeksie, a greph-index CLI służą do przekazywania diagnostyki planera do stderr. Natywny searchText sam z niego nie korzysta.
Greph\Ast\AstSearchOptions
Niezmienny obiekt opcji wyszukiwania i przepisywania 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,
)
Domyślny filtr typów plików w trybie AST to php. Gdy skipParseErrors ma wartość true (domyślną), pliki, których nie można sparsować, są po cichu pomijane; ustaw tę opcję na false, aby błędy parsowania były zgłaszane jako wyjątki. tracePlan jest używane przez rozgrzane wyszukiwarki AST, a greph-index ast-index|ast-cache search służy do emitowania diagnostyki przycinania kandydatów.
Greph\Walker\WalkOptions
Obiekt opcji tylko do odczytu dla przechodzenia po plikach.
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
Rozwiązuje nazwane typy plików do list rozszerzeń. Wbudowane aliasy:
| Alias | Rozszerzenia |
|---|---|
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']);
Obiekty wynikowe
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 i AstCacheBuildResult mają tę samą strukturę, z odpowiednio podstawionymi factCount i cachedTreeCount.
Wyjątki
Greph zgłasza trzy typowane wyjątki, wszystkie z Greph\Exceptions:
| Wyjątek | Kiedy jest zgłaszany |
|---|---|
WalkerException |
Błędy systemu plików podczas przechodzenia (brakująca ścieżka, katalog bez dostępu do odczytu) |
PatternException |
Nieprawidłowe wyrażenie regularne lub wzorzec AST |
ParseException |
Nie można sparsować źródła PHP (tylko gdy skipParseErrors: false) |
Metody wyszukiwania indeksowanego zgłaszają \RuntimeException, gdy w żądanej lokalizacji nie ma indeksu. greph-index CLI udostępnia opcję --fallback scan, która przechwytuje te błędy i zamiast tego przeprowadza skanowanie bez indeksu.