austinhyde / iniparser
A Zend_Config_Ini 类型的 .ini 文件解析器。
This package is not auto-updated.
Last update: 2024-09-14 13:50:42 UTC
README
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