civicrm / php-array-doc
v0.1.6
2024-06-27 01:53 UTC
Requires
- php: ~7.3|~8.0
README
这是一个针对PHP数据子集的解析器/打印器。文档看起来像
<?php return [ 'key_1' => 'value_1', 'key_2' => [2.1, 2.2, 2.3], 'key_3' => [ 'part_a' => 'Apple', 'part_b' => 'Banana', ] ];
此外,您还可以声明标签/工厂值
<?php use MyHelper as H; return [ 'name' => 'greeter', 'label' => H::translate('Hello World'), ];
甚至
use MyHelper as H; return H::record([ 'name' => 'greeter', 'label' => H::translate('Hello World'), ]);
PhpArrayDocument 是与PHP兼容的子集,考虑以下因素
- 允许
array值和scalar值(string、int、bool等)。 - 允许 tagged-values 或 factory-functions,它们看起来像 全局或静态方法调用。
- 允许延迟构建(
fn() => [...data...])。 - 禁止对象、循环、数学、连接、包含、自定义函数等。
模型
- 基本概念
- 内容:每个 "PHP数组文档" 包含一个由
array和scalar组成的树。 - 元数据:单个值可以被注释和/或工厂函数(如
ts(...))注释。 - 评估:如果您直接
include或requirePHP文档,您将直接得到array和scalar。 - 读写:如果您需要以编程方式检查或更新内容,那么
PhpArrayDocument旨在帮助您。
- 内容:每个 "PHP数组文档" 包含一个由
- 动词
- 解析:将PHP文档作为
PhpArrayDocument实例读取。 - 打印:将
PhpArrayDocument作为字符串渲染(<?php return [...])。 - 导入数据:将基本的PHP数组数据添加到
PhpArrayDocument(不包含任何元数据/注释/工厂函数)。 - 导出数据:获取PHP(丢弃任何元数据/注释/工厂函数)。
- 遍历节点:访问树中的所有节点。对于通用过滤/搜索/替换很有用。
- 解析:将PHP文档作为
- 类
- 数据关注类
PhpArrayDocument:这捕获了整个*.php文件,包括任何顶级元素(use或 docblocks)和根array。ArrayNode(扩展BaseNode):树中对应于array()的元素。ArrayItemNode(扩展BaseNode):存在于array()中的键值对。ScalarNode(扩展BaseNode):存在于数组中的原子值。
- 功能关注类
Parser:接受原始string。生成PhpArrayDocument。Printer:接受PhpArrayDocument。生成字符串。
- 数据关注类
示例
# Generate a file from basic array data use PhpArrayDocument\PhpArrayDocument; $doc = PhpArrayDocument::create(); $doc->getRoot()->importData([ 'foo...', 'bar...', ]); file_put_contents($file, (new Printer())->print($doc));
# Update a file use PhpArrayDocument\Parser; $file = 'my-example.data.php'; $doc = (new Parser())->parse(file_get_contents($file)); $doc->root['label'] = ScalarNode::create('Hello World') ->setFactory('E::ts'); file_put_contents($file, (new Printer())->print($doc));
# Rename a factory method $doc = (new Parser())->parse(file_get_contents($file)); foreach ($doc->root->walkNodes() as $node) { if ($node->getFactory() === 'OldHelper::method') { $node->setFactory('NewHelper::method'); } }
速查表
一些有助于调试的命令
## Parse a PHP file cat examples/simple-array.php | ./scripts/parse.php | less ## Parse an improvised PHP snippet echo '<?php return [1,2,3];' | ./scripts/parse.php ## Tokenize a PHP file cat examples/simple-array.php | ./scripts/tokenize.php | less ## Tokenize an improvised PHP snippet echo '<?php return [1,2,3];' | ./scripts/tokenize.php