tajawal / php-ini-parser
A Zend_Config_Ini 类型的 .ini 文件解析器。
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