me-io/php-ini-parser

用于解析 .ini 文件的类似 Zend_Config_Ini 的解析器。

1.0.2 2018-05-15 12:30 UTC

This package is not auto-updated.

Last update: 2024-09-15 06:34:03 UTC


README

PHP .ini 解析器

Ini 解析器是一个用于复杂 INI 文件的简单解析器,提供了许多额外的语法特性,包括部分继承、属性嵌套和数组字面量。

Build Status Code Cov Scrutinizer downloads MIT License Donate

All Contributors PRs Welcome Code of Conduct Watch on GitHub Star on GitHub Tweet

安装

在您的 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 许可证