【问题标题】:$settings array or Config Class to store project settings?$settings 数组或配置类来存储项目设置?
【发布时间】:2011-03-17 06:52:59
【问题描述】:

我应该如何存储项目的设置?

哪个更好 - 将 $settings 数组与我的所有设置一起使用:

$settings['max_photos'] = 30;
//...

或者创建一个包含所有设置的单例Config 类?

Class Config {
    private $max_photos = 30;
    //...
}

有什么好的例子吗?

【问题讨论】:

    标签: php oop class configuration


    【解决方案1】:

    最好的方法是将您的设置存储在一个文件中。 并操作这个文件声明一个对文件进行操作的类

    【讨论】:

      【解决方案2】:

      如果项目设置太重,那么file(xml更好)好,设置专用类也好。

      如果项目设置小,最好使用数组,速度很快,不会出现I/O相关问题。

      即使您可以使用数据库(速度较慢和身份验证问题)。

      【讨论】:

        【解决方案3】:

        任何一个都可以很好地工作,做任何你觉得最舒服的。

        【讨论】:

          【解决方案4】:

          我认为最好使用常量进行配置。例如使用类常量:

          class Config {
              const
              max_photos     = 30,
              something_else = 100,
              // ...
              ;
          }
          
          echo Config::max_photos;
          

          如果你有 PHP 5.3,你也可以将它们定义为全局常量:

          const MAX_PHOTOS = 30;
          
          echo MAX_PHOTOS;
          

          但我认为这远没有那么干净和直接。

          显然,这仅在您仅存储常量(即标量、非表达式值)时才有效。例如,如果您的配置包含数组,这将不再有效。在这种情况下,我将使用具有公共静态属性的 Config 类:

          class Config {
              public static $per_page = 30;
              public static $array = array(...);
          }
          
          echo Config::$per_page;
          

          后者与$config 数组方法非常相似,但有一个好处(或者这可能是一个缺点?),该类可以从任何地方访问,包括函数和类,而数组只能在全局中访问除非您使用 global $config; 将其导入到函数/类中。

          【讨论】:

          • +1 常量用于常量值,那么您可以确信它们始终是设置的、不可更改的和持久的; fwiw 静态类变量会影响性能,并且可以在运行时更改。最后,如果有人建议配置 ini 或 xml 文件 - 简单的回答是,为什么要浪费时间并添加不需要的额外负载(解析读取等)。
          • 谢谢,是的,我也有数组:$settings['languages'] = array( 'eng' => 'In English', 'rus' => 'По-русски', 'lat ' => '拉特维斯基' ); $settings['site_title'] = _("网站标题"); $settings['default_lng'] = 'eng'; /** * Мин. количество гололов /$settings['min_votes'] = 3; /* * Кол-во пользователей, после которого регистрация только по приглашениям。 /$settings['invites'] = 100000;//25000; /* * Время истечения приглашения */ $settings['invite_timeout'] = 86400 * 3;我认为,这个变种更好,谢谢大家的帮助!
          【解决方案5】:

          如果你使用数组方法,你可以使用数组字面量来获得更易读的代码:

          $settings = array(
              'max_photos' => 30,
              'max_width'  => 100
              //...
          )
          

          【讨论】:

            【解决方案6】:

            我的两分钱:两者都用。大多数应用程序配置设置都属于全局数组变量。配置数据需要可从不同的应用程序部分访问,这就是全局变量的用途。将所有内容放在一个数组中是最明智的。可以扩展数组,例如例如在 config.php 中设置的一些选项,其余的则从 config.ini 中读取。

            但也有 CONSTANTS 的位置。要画的细线是,如果一个选项真的是在应用程序运行时可能会改变的东西,或者它更像是一个固定/神奇的值。如果一旦设置,您不应该更改应用程序设置(或渲染可能会失败),那么此选项不应该在数组中,而是在语义上固定为常量。 (这是一个解释性的经验法则,但对我很有帮助。)

            【讨论】:

              【解决方案7】:

              我倾向于将只能在全局范围内访问的配置值放在一个配置数组中,并定义在任何地方都可以访问的值。例如:

              inc/config.php

              // only accessed in global scope (see init.php)
              $config['error_reporting'] = E_ALL & ~E_NOTICE;
              $config['memory_limit'] = '16M';
              $config['time_zone'] = 'America/Los_Angeles';
              
              // accessed within functions or class methods (see somefile.php)
              define('HTTP', 'http://imac.local/my_site/');
              define('HTTPS', 'http://imac.local/my_site/');
              define('FILE_ROOT', '/Library/WebServer/Documents/my_site/');
              

              inc/init.php

              require 'inc/config.php';
              
              /* Set some php configurations */
              isset($config['error_reporting']) ? error_reporting($config['error_reporting']) : '';
              isset($config['time_limit']) ? set_time_limit($config['time_limit']) : '';
              isset($config['memory_limit']) ? ini_set('memory_limit', $config['memory_limit']) : '';
              isset($config['timezone']) ? date_default_timezone_set($config['timezone']) :  date_default_timezone_set('America/Los_Angeles');
              

              somefile.php

              require 'inc/init.php';
              
              function site_url($uri, $secure = FALSE)
              {
                  return $secure ? HTTPS . $uri : HTTP . $uri;
              }
              

              请记住,这个例子是为了展示一个想法而被精简的。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-06-14
                • 1970-01-01
                • 1970-01-01
                • 2011-08-23
                • 1970-01-01
                • 1970-01-01
                • 2016-04-09
                相关资源
                最近更新 更多