8

我正在编写一个应用程序,允许用户修改和更改他们的一些网站设置。我只是在构建一个表单生成器,它将向各种插件发送各种选项以生成代码我想知道我是否应该为此使用对象而不是多维数组?如果是这样,我将如何更改我的代码?

所以现在我做了这个——它很长而且会变得更长,所以为了简洁起见,我只粘贴了一部分:-

$scopeSettings = array(
    'site_background' => array(
        'subpanels' => array(
            'colour' => array(
                'plugins' => array(
                    'colourchooser' => array(
                        'tip' => "The background colour appears underneath the 'Background Image' (if set)-hover over the '?' around the colour chooser for extra tips on how to use it",
                        'element' => 'body',
                        'gradientenabled' => 'true',
                        'opts' => array (
                            'closed' => 'true',
                            'advanced' => array(
                                'tip' => "You can paste in your own generated gradient codes in here",
                                'checkbox' => true
                            )//end advanced
                        )//end Opts
                    )//end colour chooser
                )//end plugins
            ),//end colour sub panel
            'pattern' => array(
                'plugins' => array(
                    'patternselector' => array(
                        'tip' => "Use the pattern selector to apply effects like moire or scan lines to your background image",
                        'element' => 'patimg'
                    )//end patternselector
                )//end plugins
            ),//end pattern sub panel
        )//end subpanels
    )//end site background
);//end scope settings

这种事情的最佳做法是什么?

4

7 回答 7

4

也许这是一种愚蠢,但您可以使用“YAML”或“JSON”作为应用程序的配置格式,不是吗?

例如 Symfony 或其他框架。

于 2012-04-27T14:17:09.583 回答
1

我的建议:尝试YAML或 XML 或JSON以获得更易读的配置文件,然后将其解析回您自己代码中的数组。

于 2012-04-27T14:20:08.143 回答
1

我会将设置存储在<insert your markup language of choice>(XML、JSON、YAML 等)中。

然后,您可以将它们缓存在一个$_SESSION变量中,如果它们不存在,则在引导时填充它:

session_start();

if (!isset($_SESSION['settings'])) {
    // Assuming you choose JSON...
    $settings = json_decode(file_get_contents('settings.json'), TRUE);
    $_SESSION['settings'] = $settings; // array
    $_SESSION['settings'] = (object)$settings; // object
}

无论您使用数组还是对象,都只是您喜欢哪种访问语法的问题:

$_SESSION['settings']['site_background']['subpanels']['colour']...
// vs.
$_SESSION['settings']->site_background->subpanels->colour...
于 2012-04-27T14:24:04.043 回答
0

我会说有些人喜欢面向数组的编程,并且使用 PHP 5.4,他们可以用一种很棒的方式表达自己。然而,越来越多的人习惯于 OOP——我也是——而且它可以是一种更易读的方式来编写您的解决方案。

于 2012-04-27T14:13:14.500 回答
0

作为这里的其他人,我的意见是使用 YAML 或 JSON - 使用它可以以非常简单的方式完成。

以您的数据结构的 JSON 格式为例:

var settings = {
    'site_background' : {
        'subpanels' : {
            'colour' : {
                'plugins' : {
                    'colourchooser' : {
                        'tip' : "The background colour appears underneath the 'Background Image' (if set)-hover over the '?' around the colour chooser for extra tips on how to use it",
                        'element' : 'body',
                        'gradientenabled' : 'true',
                        'opts' : {
                            'closed' : 'true',
                            'advanced' : {
                                'tip' : "You can paste in your own generated gradient codes in here",
                                'checkbox' : true
                            }//end advanced
                        }//end Opts
                    }//end colour chooser
                }//end plugins
            },//end colour sub panel
            'pattern' : {
                'plugins' : {
                    'patternselector' : {
                        'tip' : "Use the pattern selector to apply effects like moire or scan lines to your background image",
                        'element' : 'patimg'
                    }//end patternselector
                }//end plugins
            }//end pattern sub panel
        }//end subpanels
    }//end site background
};//end scope

您可以使用 json_encode 和 json_decode 等 PHP 函数进行 JSON <-> PHP 数据转换。使用花括号意味着元素是对象,而当用 [ 和 ] 替换时,您会得到数组...

但也可以成功使用 PHP OOP 方法,尤其是在使用可扩展性时。您可以拥有一个具有一些默认属性的主类设置,例如魔术 __get 和 __set 函数,然后您可以实现许多从该主设置类扩展的子设置子类。

于 2012-04-27T14:52:24.243 回答
0

我认为在这条路线上,我会采用结构化的面向对象的路线。您可以拥有一个包含所有子对象(设置组)的父对象,您甚至可以将设置组作为其自己的对象进行检索。每个对象都有自己的定义和属性,这些定义和属性可以记录在 IDE 中提供有用信息的代码中(如果您使用 docblocks)。

于 2012-04-27T14:21:13.490 回答
0

我会使用对象。假设你正在制作一个表格,你应该有几个类:

  • Form- 保存表单,将有一个属性$input_list(或$node_list保存所有输入
  • Input- 要描述单个输入项,它应该具有labeltype等属性tip
  • Fieldset- 描述一个字段集,在里面保存额外的项目。像Form类一样,它必须在其中$input_list保存所有输入。

这些类可以独立存在,并且可以扩展为具有自定义的通用输入类型(例如)

class Checkbox extends Input {
    public $type = 'checkbox'
    ....
}
于 2012-04-27T14:25:09.143 回答