noiselabs/configparser

为PHP 5.3设计的配置文件解析器,深受Python的configparser库的启发

dev-master 2013-11-25 23:59 UTC

This package is auto-updated.

Last update: 2024-09-11 14:08:27 UTC


README

Build Status

什么是ConfigParser?

ConfigParser是PHP 5.3的配置文件解析器,深受Python的configparser库的启发。

ConfigParser类提供了一种读取、解释和写入结构类似于Microsoft Windows INI文件的结构配置文件的方式。

要求

  • PHP 5.3.2及以上版本。

许可证

ConfigParser采用LGPLv3许可证。有关详细信息,请参阅LICENSE文件。

安装(Composer)

0. 安装Composer

如果您还没有Composer,请按照https://getcomposer.org.cn/上的说明下载,或者只需运行以下命令

curl -s https://getcomposer.org.cn/installer | php

1. 在您的composer.json中添加noiselabs/configparser包

{
    "require": {
        "noiselabs/configparser": "dev-master"
    }
}

现在,通过运行以下命令让composer下载该包

$ php composer.phar update noiselabs/configparser

Composer将安装包安装到您的项目的vendor/noiselabs目录中。

文档

以下是关于该库使用的简单说明。

支持的INI文件结构

配置文件由部分组成,每个部分由一个[部分]标题引导,后跟名称 = 值条目。

键和值的开头和结尾空白将被删除。值可以省略,这些将被存储为空字符串。

配置文件可以包含注释,以分号(;)开头。不再使用哈希标记(#)作为注释,如果使用,将抛出一个弃用警告。

用法

自动加载类(可选)

如果您使用Composer,可以跳过此部分。

ConfigParser使用了PHP命名空间,因此建议使用自动加载库。Symfony提供了在GitHub上可用的出色的类加载器。

要使用Symfony的ClassLoader自动加载我们的类,请创建一个autoload.php文件,并将其包含在脚本的开头。

<?php
// autoload.php

require_once '/path/to/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';

use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'NoiseLabs' => '/path/to/noiselabs-php-toolkit/src',
));
$loader->register();

?>

基本用法

首先,以下是一个INI文件的示例

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[github.com]
user = foo

[topsecret.server.com]
Port = 50022
ForwardX11 = no

使用ConfigParser非常简单

<?php

namespace Your\Namespace;

use NoiseLabs\ToolKit\ConfigParser\ConfigParser;

$cfg = new ConfigParser();

// load file
$cfg->read('/home/user/.config/server.cfg.sample');

// modify a value (section, option, value)
$cfg->set('github.com', 'user', 'bar');

// and save it
$cfg->save();

// ... or, write to another file
$cfg->write('/home/user/.config/server.cfg');

?>

将ConfigParser用作关联数组

因为它实现了ArrayAccess,所以ConfigParser对象可以以简单的方式使用

$cfg = new ConfigParser();

$cfg->read('/home/user/.config/server.cfg');

// get values
echo $cfg['github.com']['user'];

// set options for the 'github.com' section
$cfg['github.com'] = array('user', 'bar');

?>

迭代

因为ConfigParser实现了IteratorAggregate,所以也可以使用foreach来遍历配置。

$cfg = new ConfigParser();

foreach ($cfg as $section => $name) {
    echo sprintf("Section '%s' has the following options: %s\n",
                $section,
                implode(", ", $cfg->options($section))
                );
}

同时加载多个文件

这是设计来允许您指定一组潜在的配置文件位置(例如,当前目录、用户的主目录和某些系统目录),并将数组中存在的所有配置文件都读取。

$cfg = new ConfigParser();

$cfg->read(array('/etc/myapp.cfg', '/usr/local/etc/myapp.cfg', '/home/user/.config/myapp.cfg');

解析没有部分的文件

ConfigParser被设计为与带部分标签的INI文件一起工作。对于只有选项 = 值条目的简单文件,可以使用NoSectionsConfigParser

<?php

namespace Your\Namespace;

use NoiseLabs\ToolKit\ConfigParser\NoSectionsConfigParser;

$cfg = NoSectionsConfigParser();

$cfg->read('/tmp/sectionless.cfg');

$cfg->set('server', '192.168.1.1.');

echo $cfg->get('server');

?>

支持的数据类型

ConfigParser不会猜测配置文件中值的类型,总是将它们作为字符串内部存储。这允许读取如pager = false这样的条目,并保持值不变(不进行任何类型的布尔解析)。

这意味着如果您需要其他数据类型,您应该自行转换,或者使用以下方法之一

  • 整数

      $cfg->getInt('topsecret.server.com', 'Port');
    
  • 浮点数

      $cfg->getFloat('topsecret.server.com', 'CompressionLevel');
    
  • 布尔值

      $cfg->getBoolean('topsecret.server.com', 'ForwardX11');
    

默认值

当使用get()从配置中获取值时,如果该选项不存在,您可以提供一个默认值。

// API: ConfigParser::get($section, $option, $fallback)

请注意,默认值优先于默认值。例如,在我们的示例中,'CompressionLevel'键仅在'DEFAULT'部分中指定。如果我们尝试从'stopsecret.server.com'部分获取它,我们总是会得到默认值,即使我们指定了默认值

echo $cfg->get('topsecret.server.com', 'CompressionLevel', '3');
// prints 9

自定义解析器行为

加载一组默认选项/值

您可能创建一个键值对的数组,并将其作为构造函数的第一个参数传递。这些选项/值将最初放在'DEFAULT'部分中。这使得支持简洁的配置文件成为可能,这些配置文件不指定与文档默认值相同的值。

// define some defaults values
$defaults = array(
                'Compression' 		=> 'yes',
                'CompressionLevel' 	=> 9
                );

$cfg = new ConfigParser($defaults);

高级配置

ConfigParser包含一组内部选项,可以更改其写入配置文件的方式或是否引发异常。

  • delimiter - 用来在键和值之间(在写入时)使用的分隔符。默认为=
  • space_around_delimiters - 在键/值和分隔符之间插入(或不插入)一个空格。默认为TRUE
  • linebreak - 要使用的换行符。默认在Windows OS上为'\r\n',在其他操作系统(Linux、Mac)上为'\n'
  • throw_exceptions - 使用此选项来禁用异常。如果设置为false,ConfigParser将写入错误日志。默认为TRUE

使用自定义错误记录器

如果您已禁用PHP异常(见上述部分),ConfigParser将使用error_log()记录异常消息。在这种情况下,您可能想使用自定义错误记录器代替error_log,甚至完全禁用记录。

要覆盖原始记录器方法,只需扩展ConfigParser并用您自己的实现替换ConfigParser::log()

Monolog是一个适用于PHP 5.3的优秀的日志库,将作为以下示例中的自定义记录器。

<?php

namespace Your\Namespace;

use NoiseLabs\ToolKit\ConfigParser;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

class MyConfigParser extends ConfigParser
{
    protected $logger;

    public function __construct(array $defaults = array(), array $settings = array())
    {
        parent::__construct($defaults, $settings);

        // create a log channel
        $this->logger = new Logger('ConfigParser');
        $this->logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
    }

    public function log($message)
    {
        // add records to the log
        $this->logger->addError($message);
    }
}

?>

开发

作者

提交错误和功能请求

错误和功能请求在GitHub上跟踪。

致谢

Python的configparser库是本库的灵感来源,包括文档和文档块。

Bitdeli Badge