通过将新值推送到数组中来帮助我的静态类逻辑

时间:2011-09-15 19:19:21

标签: php

我正在尝试创建一个可以为我加载.ini文件的类。我要指定我正在使用的应用程序的名称,然后给它一个或一组文件,以便为我加载。一旦完成,我就这样称呼它。

Ini::path(BASE_PATH . "config" . DS);
Ini::set_app("testApp");
Ini::load(array("db", "web", "themer"));

然后我试图像这样使用它

echo Ini::$get['testApp']['someKey']['someValue'];

目前我可以在没有设置Ini::$app的情况下使用它,因为我正在尝试添加这些功能。即Ini::$get['someKey']['someValue'];

我的问题是我无法弄清楚如何将更多.ini个文件推送到Ini::$get数组中。用法应该是这样的

Ini::push("anotherIni");

假设调用我的push方法并将新文件推送到数组中。但我似乎无法正确构建数组。要么是这样,要么就不可能将新值推送到静态数组中。

我使用array_push尝试的数组看起来像是用print_r()

输出的盎司
Array ( [testApp] => )

否则它输出这个没有我试图将新的ini推入数组

Array ( [testApp] => Array ( [db] => [web] => [themer] => ) )

这是我的班级文件(更新以反映答案)

    class Ini {

    public static $get = array();
    public static $tmp = array();
    public static $path;
    public static $app;
    public static $push;

    public static function load($file)
    {
        if (is_array($file)) {

            foreach ($file as $ini)
                self::$get[self::$app][$ini] = parse_ini_file(self::$path . $ini . ".ini", true);

            //array_push(self::$get[self::$app], "testIni");
        } else {

            self::$get[self::$app][$file] = parse_ini_file(self::$path . $file . ".ini", true);
        }
    }

    public static function push($file)
    {
        self::$tmp[$file] = parse_ini_file(self::$path . $file . ".ini", true);
        array_push(self::$get[self::$app], self::$tmp[$file]);
    }

    public static function set_app($name)
    {
        self::$app = $name;
        self::$get[self::$app] = array();
    }

    public static function path($path)
    {
        self::$path = $path;
        return self::$path;
    }

    // TODO: Create 'write', 'delete', 'append' function to change ini values
}

2 个答案:

答案 0 :(得分:1)

问题出在这一行:

array_push(self::$get[self::$app], $file);

array_push()期望一个数组作为它的第一个参数。我将您的类复制粘贴到PHP文件中,然后使用以下代码:

Ini::$app = 'Some App';

Ini::push('something.ini');

并收到“array_push()期待...”错误。这是因为self::$get[self::$app]字符串,而不是数组。

因此,您需要一种方法,将$get数组的第一个条目设置为具有self::$app的键和空白数组的值。这个附加方法为我修复了它:

public static function set_app_name($name)
{
  self::$app = $name;
  self::$get[self::$app] = array();
}

然后使用

Ini::set_app_name('Some App');

答案 1 :(得分:0)

我会回答你的问题,但恕我直言,您的代码有几个主要问题:

  • 为什么一切都是静止的?如果ini配置在一个对象中会更有意义。如果你只想强迫它的独特性,请阅读单身模式。
  • $app静态属性的目的不明确。它需要在加载或读取文件之前初始化。这几乎是不可读的。至少,您的代码使用方法setDefaultApp($appName)会更清晰,而不是直接设置此属性。
  • 在数组$e的末尾添加元素$a有两种语法:

    $a[] = $e;
    array_push($a, $e); // scarcely used
    

    使用后一种语法,$a必须是数组it won't be initialized。所以使用替代语法:

    self::$get[self::$app][] = $file;
    

    但我强烈建议您选择更具可读性的API。致echo Ini::$get['testApp']['someKey']['someValue'];我更喜欢echo $ini->get('testApp')['someKey']['someValue'];