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 许可证。