2

我有一个用 PHP 编写的配置文件,如下所示,

<?php

class WebConfig {

    public static $WEBPATH = '/customers';
    public static $ACCOUNTPATH = '/empaccountpath';
    public static $INFO = '/accountInfo';
    const ACCOUNT_STATUS = '/account_status';
    const ENABLE_SEARCH = '/enable_search';
}

?>

所以我想在 PHP 中开发一个接口,它能够编辑文件值,如$WEBPATH,$ACCOUNTPATHconst值。

简单的 PHP 编辑器脚本将完成上述工作。但它不检查语法。

请建议如何在 PHP 中有效地做到这一点。

4

2 回答 2

3

更好的解决方案

许多其他配置存储格式更适合这种事情。查看文件返回php数组、、、inijsonxmlyaml

PHP文件返回数组”是一个简单的 PHP 文件,看起来像这样

return(
    array(
        'config_key' => 'config_value'
    )
);

?>

当您包含此文件时,您的代码可以检索此文件的返回值:$x = include('file.php');并且$x将在数组中包含这些值。

INI为人类阅读或书写简单直观。它的结构有限。PHP 可以使用一个函数读取它,但它仅在单独的(非默认)包中具有写入功能。这意味着您必须自己生成 ini 文件。

JSON对于人类来说,阅读或写作“相当”简单直观。它具有灵活的结构可扩展结构。JSONPHP 只需使用几个函数就可以读取和写入文件。不幸的是,PHP 不保留JSON漂亮的打印格式,因此在您覆盖文件后,它将全部在一行中,之后更难阅读。

XML对于人类来说阅读起来简单直观,它可以提供非常丰富的信息,因为它对所有内容都非常冗长。I 的结构几乎与它一样灵活,JSON并且是可扩展的。PHP 可以读取和写入,XML但这样做意味着使用几行代码(简单的东西是 5-10 行)。

YAML是另一个易于阅读和编写的选项,PHP 没有直接YAML支持,但还有其他选项(见下文)。它的结构灵活且可扩展。对我个人来说,理解YAML不太直观。

Zend_Config可用作读取/写入上述任何格式的接口,并可用于抽象文件格式本身并为您的应用程序提供与格式无关的配置处理方式。

您还可以使用数据库来存储您的配置或一个单独的 SQLite 数据库,专门用于存储一般配置 - 这通常用于需要以细粒度的可搜索格式保留许多配置,以允许各种类型的分层覆盖(例如。 :一般默认值、控制器默认值、动作默认值、特殊情况默认值)。

如何在 PHP 中做到这一点

您不需要像@geomagas 所说的那样创建语言解析器。使用includeorrequire就足够了,PHP 解释器会将“新”类加载到内存中并确保它可用。

您需要做的就是创建一个模板文件来替换一些值,例如:

<?php

class WebConfig {

    public static $WEBPATH = '$_replace_webpath';
    public static $ACCOUNTPATH = '$_replace_accountpath';
    public static $INFO = '$_replace_info';
    const ACCOUNT_STATUS = '$_replace_account_status';
    const ENABLE_SEARCH = '$_replace_enable_search';
}

然后加载读取文件,并将其替换为当前值,例如:

$config_template = file_get_contents('/path/to/config/template.php.template');
str_replace(
    array('$_replace_webpath' ... ),
    array('/customers' ... ),
    $config_template
);

PrestaShop使用 PHP 文件进行配置。它会在需要时重写它们。

于 2013-11-05T08:23:15.360 回答
0

直接访问PHP Class文件太危险了....很多安全问题....

我们可以使用简单的 html 表单让用户进行编辑吗?

使用 JSON 格式存储到文件中。

PHP 在保存和读取值时通过 json_encode() 和 json_decode() 进行编码和解码。

于 2013-11-05T08:15:11.027 回答