From 120e89ac79c9a9357d3e5d0170d1f1270f0c02cc Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Tue, 3 Feb 2026 18:26:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(examples):=20=E6=B7=BB=E5=8A=A0=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E7=A4=BA=E4=BE=8B=E6=96=87=E4=BB=B6=E6=BC=94=E7=A4=BA?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 autoload_class.php 示例演示类自动加载功能 - 添加 check_parser_api.php 示例验证 PHP 解析器 API 正确性 - 添加 file_scanner_example.php 示例展示文件扫描器基本用法 - 添加 file_scanner_usage.php 示例演示文件扫描器高级用法 - 添加 scan_with_exclusions.php 示例展示排除模式功能 - 添加 simple_scan.php 示例演示简单扫描操作 - 添加 test_exclusions.php 示例测试排除模式有效性 - 添加 test_fnmatch.php 示例验证路径匹配函数行为 - 添加 test_php_parser_check.php 示例测试 PHP 解析器语法检查 - 添加 test_php_syntax_check.php 示例验证 PHP 语法检查功能 - 添加 trait.php 示例演示 trait 特性用法 --- examples/autoload_class.php | 13 +++ examples/check_parser_api.php | 23 +++++ examples/file_scanner_example.php | 37 ++++++++ examples/file_scanner_usage.php | 53 ++++++++++++ examples/scan_with_exclusions.php | 42 +++++++++ examples/simple_scan.php | 38 +++++++++ examples/test_exclusions.php | 35 ++++++++ examples/test_fnmatch.php | 21 +++++ examples/test_php_parser_check.php | 133 +++++++++++++++++++++++++++++ examples/test_php_syntax_check.php | 88 +++++++++++++++++++ examples/trait.php | 28 ++++++ 11 files changed, 511 insertions(+) create mode 100644 examples/autoload_class.php create mode 100644 examples/check_parser_api.php create mode 100644 examples/file_scanner_example.php create mode 100644 examples/file_scanner_usage.php create mode 100644 examples/scan_with_exclusions.php create mode 100644 examples/simple_scan.php create mode 100644 examples/test_exclusions.php create mode 100644 examples/test_fnmatch.php create mode 100644 examples/test_php_parser_check.php create mode 100644 examples/test_php_syntax_check.php create mode 100644 examples/trait.php diff --git a/examples/autoload_class.php b/examples/autoload_class.php new file mode 100644 index 00000000..c5585be2 --- /dev/null +++ b/examples/autoload_class.php @@ -0,0 +1,13 @@ +getCount()); +} diff --git a/examples/check_parser_api.php b/examples/check_parser_api.php new file mode 100644 index 00000000..ae26b5e9 --- /dev/null +++ b/examples/check_parser_api.php @@ -0,0 +1,23 @@ +create(ParserFactory::PREFER_PHP7); + +var_dump($parser); +echo "Parser class: " . get_class($parser) . "\n"; +echo "Has parse method: " . (method_exists($parser, 'parse') ? 'yes' : 'no') . "\n"; + +// 尝试解析一个简单的 PHP 代码 +$code = 'parse($code); + echo "Parse successful\n"; + var_dump($stmts); +} catch (\PhpParser\Error $e) { + echo "Parse error: " . $e->getMessage() . "\n"; +} \ No newline at end of file diff --git a/examples/file_scanner_example.php b/examples/file_scanner_example.php new file mode 100644 index 00000000..c1efc491 --- /dev/null +++ b/examples/file_scanner_example.php @@ -0,0 +1,37 @@ +addExcludePattern('*/vendor/*'); +$scanner->addExcludePattern('*/node_modules/*'); +$scanner->addExcludePattern('*.log'); +$scanner->addExcludePattern('*/tests/aot/*'); + +// 扫描当前项目目录 +echo "扫描项目中的 PHP 和 C++ 文件...\n"; + +try { + $files = $scanner->scan(__DIR__ . '/..'); // 扫描项目根目录 + + echo "找到 " . count($files) . " 个文件:\n"; + + foreach ($files as $index => $file) { + echo ($index + 1) . ". " . $file . "\n"; + } + + echo "\n带统计信息的扫描:\n"; + $result = $scanner->scanWithStats(__DIR__ . '/..'); + + echo "总共找到 {$result['count']} 个文件\n"; + echo "按扩展名统计:\n"; + foreach ($result['stats'] as $ext => $count) { + echo " $ext: $count 个文件\n"; + } + +} catch (Exception $e) { + echo "错误: " . $e->getMessage() . "\n"; +} \ No newline at end of file diff --git a/examples/file_scanner_usage.php b/examples/file_scanner_usage.php new file mode 100644 index 00000000..1e5543f3 --- /dev/null +++ b/examples/file_scanner_usage.php @@ -0,0 +1,53 @@ +addExcludePattern('*/tests/*'); // 排除测试目录 + $scanner->addExcludePattern('*/vendor/*'); // 排除vendor目录 + + echo "扫描目录: " . $scanner->getDirectory() . "\n"; + + // 扫描文件 + $files = $scanner->scan(); + + echo "找到 " . count($files) . " 个文件:\n"; + + // 只显示前20个文件以避免输出过多 + $count = 0; + foreach ($files as $index => $file) { + if ($count >= 20) { + echo "... 还有 " . (count($files) - $count) . " 个文件\n"; + break; + } + echo ($index + 1) . ". " . $file . "\n"; + $count++; + } + + echo "\n带统计信息的扫描:\n"; + $result = $scanner->scanWithStats(); + + echo "总共找到 {$result['count']} 个文件\n"; + echo "按扩展名统计:\n"; + foreach ($result['stats'] as $ext => $count) { + echo " $ext: $count 个文件\n"; + } + + // 测试只扫描 PHP 文件 + echo "\n只扫描 PHP 文件:\n"; + $phpScanner = new FileScanner(__DIR__ . '/..', ['.php']); + $phpFiles = $phpScanner->scan(); + echo "找到 " . count($phpFiles) . " 个 PHP 文件\n"; + +} catch (Exception $e) { + echo "错误: " . $e->getMessage() . "\n"; +} \ No newline at end of file diff --git a/examples/scan_with_exclusions.php b/examples/scan_with_exclusions.php new file mode 100644 index 00000000..c6821d13 --- /dev/null +++ b/examples/scan_with_exclusions.php @@ -0,0 +1,42 @@ +addExcludePattern('*/tests/*'); // 排除测试目录 +$scanner->addExcludePattern('*/vendor/*'); // 排除vendor目录 +$scanner->addExcludePattern('*.phpt'); // 排除PHPT测试文件 + +echo "扫描项目中的 PHP 和 C++ 文件(排除测试文件)...\n"; + +try { + $files = $scanner->scan(__DIR__ . '/..'); // 扫描项目根目录 + + echo "找到 " . count($files) . " 个文件:\n"; + + // 只显示前20个文件以避免输出过多 + $count = 0; + foreach ($files as $index => $file) { + if ($count >= 20) { + echo "... 还有 " . (count($files) - $count) . " 个文件\n"; + break; + } + echo ($index + 1) . ". " . $file . "\n"; + $count++; + } + + echo "\n带统计信息的扫描:\n"; + $result = $scanner->scanWithStats(__DIR__ . '/..'); + + echo "总共找到 {$result['count']} 个文件\n"; + echo "按扩展名统计:\n"; + foreach ($result['stats'] as $ext => $count) { + echo " $ext: $count 个文件\n"; + } + +} catch (Exception $e) { + echo "错误: " . $e->getMessage() . "\n"; +} \ No newline at end of file diff --git a/examples/simple_scan.php b/examples/simple_scan.php new file mode 100644 index 00000000..b4c5097a --- /dev/null +++ b/examples/simple_scan.php @@ -0,0 +1,38 @@ +scan(__DIR__ . '/..'); // 扫描项目根目录 + + echo "找到 " . count($files) . " 个文件:\n"; + + // 只显示前20个文件以避免输出过多 + $count = 0; + foreach ($files as $index => $file) { + if ($count >= 20) { + echo "... 还有 " . (count($files) - $count) . " 个文件\n"; + break; + } + echo ($index + 1) . ". " . $file . "\n"; + $count++; + } + + echo "\n带统计信息的扫描:\n"; + $result = $scanner->scanWithStats(__DIR__ . '/..'); + + echo "总共找到 {$result['count']} 个文件\n"; + echo "按扩展名统计:\n"; + foreach ($result['stats'] as $ext => $count) { + echo " $ext: $count 个文件\n"; + } + +} catch (Exception $e) { + echo "错误: " . $e->getMessage() . "\n"; +} \ No newline at end of file diff --git a/examples/test_exclusions.php b/examples/test_exclusions.php new file mode 100644 index 00000000..f4d1f979 --- /dev/null +++ b/examples/test_exclusions.php @@ -0,0 +1,35 @@ +scan(); +echo "所有文件数量: " . count($allFiles) . "\n"; + +echo "\n测试排除模式...\n"; +$scannerWithExclusions = new FileScanner(__DIR__ . '/..', ['.php', '.cc', '.cpp', '.cxx', '.c', '.h', '.hpp']); +$scannerWithExclusions->addExcludePattern('*/tests/*'); // 排除测试目录 +$filteredFiles = $scannerWithExclusions->scan(); +echo "排除测试目录后的文件数量: " . count($filteredFiles) . "\n"; + +// 检查结果中是否确实没有包含 tests 目录的文件 +$testFilesFound = 0; +foreach ($filteredFiles as $file) { + if (strpos($file, '/tests/') !== false) { + $testFilesFound++; + } +} + +echo "在过滤后的结果中找到 $testFilesFound 个在 tests 目录中的文件\n"; + +// 显示一些过滤后的文件 +echo "\n前10个过滤后的文件:\n"; +$counter = 0; +foreach ($filteredFiles as $file) { + if ($counter >= 10) break; + echo ($counter + 1) . ". " . $file . "\n"; + $counter++; +} \ No newline at end of file diff --git a/examples/test_fnmatch.php b/examples/test_fnmatch.php new file mode 100644 index 00000000..aaed1a7f --- /dev/null +++ b/examples/test_fnmatch.php @@ -0,0 +1,21 @@ +scan(); + + echo "找到 " . count($definitionFiles) . " 个有效定义文件:\n"; + foreach ($definitionFiles as $file) { + $basename = basename($file); + echo " - $basename\n"; + } + + // 测试扫描所有 PHP 文件(不检查语法) + echo "\n扫描所有 PHP 文件(不检查语法):\n"; + $scanner2 = new FileScanner($testDir, ['.php'], false); // 不启用语法检查 + $allFiles = $scanner2->scan(); + + echo "找到 " . count($allFiles) . " 个文件:\n"; + foreach ($allFiles as $file) { + $basename = basename($file); + echo " - $basename\n"; + } + + echo "\n预期结果:\n"; + echo "- definitions.php 应该被包含(只包含定义)\n"; + echo "- with_require.php 应该被包含(require 是允许的)\n"; + echo "- executable.php 不应该被包含(包含全局执行逻辑)\n"; + + // 清理测试文件 + unlink($definitionFile); + unlink($executableFile); + unlink($requireFile); + rmdir($testDir); + +} catch (Exception $e) { + echo "错误: " . $e->getMessage() . "\n"; + + // 清理测试文件(如果出错) + if (file_exists($definitionFile)) unlink($definitionFile); + if (file_exists($executableFile)) unlink($executableFile); + if (file_exists($requireFile)) unlink($requireFile); + if (is_dir($testDir)) rmdir($testDir); +} \ No newline at end of file diff --git a/examples/test_php_syntax_check.php b/examples/test_php_syntax_check.php new file mode 100644 index 00000000..deb54b46 --- /dev/null +++ b/examples/test_php_syntax_check.php @@ -0,0 +1,88 @@ +scan(); + + echo "找到 " . count($definitionFiles) . " 个有效定义文件:\n"; + foreach ($definitionFiles as $file) { + echo " - $file\n"; + } + + // 测试扫描所有 PHP 文件(不检查语法) + echo "\n扫描所有 PHP 文件(不检查语法):\n"; + $scanner2 = new FileScanner($testDir, ['.php'], false); // 不启用语法检查 + $allFiles = $scanner2->scan(); + + echo "找到 " . count($allFiles) . " 个文件:\n"; + foreach ($allFiles as $file) { + echo " - $file\n"; + } + + // 清理测试文件 + unlink($definitionFile); + unlink($executableFile); + rmdir($testDir); + +} catch (Exception $e) { + echo "错误: " . $e->getMessage() . "\n"; + + // 清理测试文件(如果出错) + if (file_exists($definitionFile)) unlink($definitionFile); + if (file_exists($executableFile)) unlink($executableFile); + if (is_dir($testDir)) rmdir($testDir); +} \ No newline at end of file diff --git a/examples/trait.php b/examples/trait.php new file mode 100644 index 00000000..9c7ee06c --- /dev/null +++ b/examples/trait.php @@ -0,0 +1,28 @@ +sayHello(); + echo ' '; + $this->sayWorld(); + echo "!\n"; + } +} + +$obj = new MyHelloWorld(); +$obj->sayHelloWorld();