austinhyde/iniparser

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

v1.0.0-beta 2013-01-05 05:41 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:50:42 UTC


README

Build Status

IniParser 是一个简单的复杂 INI 文件解析器,它为内置的 INI 解析函数提供了许多额外的语法功能,包括部分继承、属性嵌套和数组字面量。

重要: IniParser 应被视为beta版本,可能还存在bug。欢迎您打开一个问题或提交一个pull请求,我会查看它!

通过 Composer 安装

将您的 composer.json 文件设置为

{
	"require": {
		"austinhyde/iniparser": "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'
    )
)

如果您能想到比连接操作更有用的非数组类型的操作,请打开一个问题

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

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