tajawal/php-ini-parser

A Zend_Config_Ini 类型的 .ini 文件解析器。

2.0.2 2017-02-16 14:40 UTC

This package is not auto-updated.

Last update: 2020-08-07 20:37:36 UTC


README

IniParser 是一个用于复杂 INI 文件的简单解析器,为内置的 INI 解析函数提供了一些额外的语法特性,包括部分继承、属性嵌套和数组文字。

通过 Composer 安装

设置您的 composer.json 文件以包含

{
	"require": {
		"tajawal/php-ini-parser": "dev-master"
	}
}

然后安装依赖项

composer install

示例

标准 INI 文件看起来像这样

key = value
another_key = another value

[section_name]
a_sub_key = yet another value

当使用 PHP 的内置 parse_ini_string()parse_ini_file() 解析时,看起来像

array(
    'key' => 'value',
    'another_key' => 'another value',
    'section_name' => array(
        '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

当使用 IniParser 解析时

$parser = new \IniParser('sample.ini');
$config = $parser->parse();

你得到以下结构

array(
    'environment' => 'testing',
    'testing' => array(
        'debug' => '1',
        'database' => array(
            'connection' => 'mysql:host=127.0.0.1',
            'name' => 'test',
            'username' => '',
            'password' => ''
        ),
        'secrets' => array('1','2','3')
    ),
    'staging' => array(
        'debug' => '1',
        'database' => array(
            'connection' => 'mysql:host=127.0.0.1',
            'name' => 'stage',
            'username' => 'staging',
            'password' => '12345'
        ),
       'secrets' => array('1','2','3')
    ),
    'production' => array(
        'debug' => '',
        'database' => array(
            'connection' => 'mysql:host=127.0.0.1',
            'name' => 'production',
            'username' => 'root',
            'password' => '12345'
        ),
        'secrets' => array('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 
       }
    ] 
 }'

这会变成一个类似以下的数组

array(
    'boss' => array(
        'name' => 'John',
        'age' => 42
    ),
    'staff' => array(
        array (
            'name' => 'Mark',
            'age' => 35,
        ),
        array (
            'name' => 'Bill',
            'age' => 44,
        ),
    ),
)

注意:请记住将 JSON 字符串用单引号括起来以正确分析。JSON 名称必须用双引号括起来,不允许有尾随逗号。

属性嵌套

IniParser 允许您将属性视为关联数组

person.age = 42
person.name.first = John
person.name.last = Doe

这会变成一个类似以下的数组

array (
    'person' => array (
        'age' => 42,
        'name' => array (
            'first' => 'John',
            'last' => 'Doe'
        )
    )
)

部分继承

遵循 DRY 原则,IniParser 允许您从其他部分“继承”(类似于 OOP 继承),这意味着您不必反复重新定义相同的属性。如上例所示,“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

将被解析成以下内容

array(
    'parent' => array(
        'arr' => array('a','b','c'),
        'val' => 'foo'
    ),
    'child' => array(
        'arr' => array('a','b','c','x','y','z'),
        'val' => 'foobar'
    )
)

如果您能想到比连接更适合非数组类型的更有用的操作,请提交一个 issue

最后,您可以继承表示顶级或全局属性的特定^部分

foo = bar

[sect : ^]

解析为

array (
    'foo' => 'bar',
    'sect' => array (
        'foo' => 'bar'
    )
)

ArrayObject

作为额外的奖励,IniParser还允许您以OO风格访问值

echo $config->production->database->connection; // output: mysql:host=127.0.0.1
echo $config->staging->debug; // output: 1