me-io / php-ini-parser
用于解析 .ini 文件的类似 Zend_Config_Ini 的解析器。
Requires
- php: >=7.0
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-15 06:34:03 UTC
README
PHP .ini 解析器
Ini 解析器是一个用于复杂 INI 文件的简单解析器,提供了许多额外的语法特性,包括部分继承、属性嵌套和数组字面量。
安装
在您的 composer.json
文件中添加以下内容 me-io/php-ini-parser
{ "require": { "me-io/php-ini-parser": "^1" } }
然后在您的终端运行以下命令以安装依赖项
composer install
示例
标准 INI 文件看起来像这样
key = value another_key = another value [section_name] a_sub_key = yet another value
当使用 PHP 的内置 parse_ini_string()
或 parse_ini_file()
解析时,看起来像
[ 'key' => 'value', 'another_key' => 'another value', 'section_name' => [ 'a_sub_key' => 'yet another value' ] ]
当您只需要一个简单的配置文件时,这是很棒的,但以下是一个在野外可能遇到的超级加强型 INI 文件
environment = testing [testing] debug = true database.connection = "mysql:host=127.0.0.1" database.name = test database.username = database.password = secrets = [1,2,3] [staging : testing] database.name = stage database.username = staging database.password = 12345 [production : staging] debug = false; database.name = production database.username = root
当使用 \Ini\Parser 解析时
$parser = new \Ini\Parser('sample.ini'); $config = $parser->parse();
您将获得以下结构
[ 'environment' => 'testing', 'testing' => [ 'debug' => '1', 'database' => [ 'connection' => 'mysql:host=127.0.0.1', 'name' => 'test', 'username' => '', 'password' => '' ], 'secrets' => ['1','2','3'] ], 'staging' => [ 'debug' => '1', 'database' => [ 'connection' => 'mysql:host=127.0.0.1', 'name' => 'stage', 'username' => 'staging', 'password' => '12345' ], 'secrets' => ['1','2','3'] ], 'production' => [ 'debug' => '', 'database' => [ 'connection' => 'mysql:host=127.0.0.1', 'name' => 'production', 'username' => 'root', 'password' => '12345' ], 'secrets' => ['1','2','3'] ] ]
支持的功能
数组字面量
您可以直接使用赋值右侧的语法 [a, b, c]
创建数组。例如
colors = [blue, green, red]
注意:目前,数组字面量内部的引号字符串具有未定义的行为。
字典和复杂结构
除了数组之外,您还可以使用 JSON 语法创建字典和更复杂的结构。例如,您可以使用
people = '{ "boss": { "name": "John", "age": 42 }, "staff": [ { "name": "Mark", "age": 35 }, { "name": "Bill", "age": 44 } ] }'
这会转换为以下数组
[ 'boss' => [ 'name' => 'John', 'age' => 42 ], 'staff' => [ [ 'name' => 'Mark', 'age' => 35, ], [ 'name' => 'Bill', 'age' => 44, ], ], ]
注意:请记住用单引号括住 JSON 字符串以进行正确分析。JSON 名称必须用双引号括起来,不允许有尾随逗号。
属性嵌套
Ini 解析器允许您将属性视为关联数组
person.age = 42 person.name.first = John person.name.last = Doe
这会转换为以下数组
[ 'person' => [ 'age' => 42, 'name' => [ 'first' => 'John', 'last' => 'Doe' ] ] ]
部分继承
遵循 DRY 原则,Ini 解析器允许您“继承”其他部分(类似于面向对象继承),这意味着您不必反复重新定义相同的属性。如上例所示,“production”继承自“staging”,而“staging”又继承自“testing”。
您甚至可以从多个父级继承,如 [child : p1 : p2 : p3]
。每个父级的属性从左到右合并到子级中,因此 p1
的属性会被 p2
的属性覆盖,然后是被 p3
的属性覆盖,最后是被 child
上的属性覆盖。
在继承过程中,如果键以 +
结尾,合并行为将从覆盖父级值变为预置父级值(或追加子级值 - 同样的事情)。因此,以下示例文件
[parent] arr = [a,b,c] val = foo [child : parent] arr += [x,y,z] val += bar
将被解析为以下内容
[ 'parent' => [ 'arr' => ['a','b','c'], 'val' => 'foo' ], 'child' => [ 'arr' => ['a','b','c','x','y','z'], 'val' => 'foobar' ] ]
如果您能想到比连接更适合非数组类型的有用操作,请提出问题
最后,还可以从特殊的 ^
部分继承,表示顶层或全局属性
foo = bar
[sect : ^]
解析为
[ 'foo' => 'bar', 'sect' => [ 'foo' => 'bar' ] ]
ArrayObject
作为额外的好处,Ini 解析器还允许您以面向对象的方式访问值
echo $config->production->database->connection; // output: mysql:host=127.0.0.1 echo $config->staging->debug; // output: 1
贡献者
非常感谢所有贡献者
许可
代码可在以下链接下获得 MIT 许可证。