【问题标题】:PHP object or an arrayPHP 对象或数组
【发布时间】:2012-05-08 07:03:48
【问题描述】:

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

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

$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

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

【问题讨论】:

    标签: php arrays object


    【解决方案1】:

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

    例如 Symfony 或其他框架。

    【讨论】:

    • 是的,实际上这听起来不错,我喜欢 JSON...;) 然后我也可以在 php 和 js 之间切换它,我可能需要这样做...我想我会尝试的...
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我会将设置存储在 <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...
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

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

            class Checkbox extends Input {
                public $type = 'checkbox'
                ....
            }
            

            【讨论】:

              【解决方案7】:

              作为这里的其他人,我的意见是使用 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 函数,然后您可以实现从这个主设置类扩展的许多子设置子类。

              【讨论】:

                猜你喜欢
                • 2015-09-13
                • 2010-09-12
                • 2020-08-07
                • 2010-11-11
                • 2012-08-09
                • 2017-10-07
                • 2018-11-08
                • 2012-01-26
                相关资源
                最近更新 更多