PHP - 常量/全局变量/配置

Ale*_*lex 2 php arrays performance constants

我有一个脚本(一个小而简单的类似CMS的系统),我一直在努力将其用于客户端站点.由于客户有不同的要求,我实施了一个模块系统,允许我修改/或添加功能到CMS,而无需修改CMS脚本.

如何实现允许我从模块更改主CMS的默认设置的配置系统?

例如,CMS默认有两个菜单:$menu = array('menu-1', 'menu-2'); 如何从模块中覆盖此设置?

我想到的一个解决方案是使用常量和序列化/反序列化:

defined("BLA") or define("BLA", serialize(array(
 'boo' => 'stuff',
 'foo' => array('1', '2', '3'),
 'moo' => true,
 ...
)));
Run Code Online (Sandbox Code Playgroud)

因此,我可以在模块初始化函数中轻松覆盖此设置,该函数在CMS中定义常量之前运行.

然后我在我的脚本中到处使用这些常量,例如:

$bla = unserialize(BLA);
...
foreach(unserialize(BLA) as $key => $value)...
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用全局变量,但人们说使用全局变量是不好的.

那么我有什么更好的解决方案吗?

aor*_*sik 5

我建议使用带有静态变量的类.或多或少相同的结果,但不需要反序列化,您实际上可以使用变量,而不是临时变量.

// My Constants
class MCo { 
    public static $BLA = array(
        'boo' => 'stuff',
        'foo' => array('1', '2', '3'),
        'moo' => true,
        // ...
    );
}

echo MCo::$BLA['boo'];

foreach (MCo::$BLA as $key => $value) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

编辑: ircmaxell有一点,考虑一下

// My Private Constants
class MPCo { 
    private static $_BLA = array(
        'boo' => 'stuff',
        'foo' => array('1', '2', '3'),
        'moo' => true,
        // ...
    );
    public static BLA() {
        return self::$_BLA;
    }
}

foreach (MPCo::BLA() as $key => $value) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)