【问题标题】:Constants or a register class?常量还是寄存器类?
【发布时间】:2009-11-11 08:38:39
【问题描述】:

我遇到了一个注册表类,我想知道是要打扰它还是只使用常量,或者是否对站点范围的全局变量(例如数据库连接信息、网站 URI 等)有单独的用途?

这是我遇到的课程:

<?php

    Class Registry {


     private $vars = array();

     public function __set($index, $value)
     {
            $this->vars[$index] = $value;
     }


     public function __get($index)
     {
            return $this->vars[$index];
     }

    }

    ?>

基本上只是一个具有神奇 getter/setter 数组的类。与使用常量相比,这段代码有什么缺点吗?

【问题讨论】:

  • 这对于考虑使用常量的情况甚至不是特别合适,因为它允许更改值。此类作为会话对象可能更有用。
  • 哦,我明白了,所以我应该同时使用这两个?

标签: php class constants


【解决方案1】:

与一堆常量相比,配置类的最大优势在于您可以拥有多个可以相互扩展的配置(针对不同的环境),例如

 // define default Config and custom ones for specific environments

 class BasicConfig {
     function __construct() {
          $this->db_driver = 'mysql';
          // other params that are common to all configs
 }

 class TestConfig extends BasicConfig {
     function __construct() {
          parent::__construct();
          $this->db_user = 'root';
          $this->db_password = '';
          // other params for test config
 }

 class ProductionConfig extends BasicConfig {
     function __construct() {
          parent::__construct();
          $this->db_user = 'liveuser';
          $this->db_password = 'secret';
          // other params for production config
 }

 // change configuration depending on where we're running
 if($_SERVER['SERVER_NAME'] == 'local')
     $config = new TestConfig;
 else
     $config = new ProductionConfig;

 // the main application doesn't care which config we're using
 $application->init($config); 

【讨论】:

  • 哦,这很不错。因此,只是为了澄清您是否仍会使用任何常量,或者将所有内容完全存储在该类中?
【解决方案2】:

虽然您在使用registry 时可能会产生少量开销,但我建议您使用它。

  1. 它将帮助您进行调试,因为您可以在一个公共位置获取所有信息。
  2. 更安全,因为用户无法通过操作 URL 添加自己的值。 register_globals 将在大多数情况下被关闭,但如果网络空间提供商存储您的网站,您将无法控制。

作为替代方案,您可以创建自己的注册表,这样您就可以通过定义自己的 getter 和 setter 来使其内容更加明确。

【讨论】:

    【解决方案3】:

    我假设你指的是命名变量。

    无论如何,您的示例中的类的优点是您现在拥有一个包含 Object 中所有变量的数组,您可以循环访问该数组,并且可以存储可变数量的数据。

    缺点是你现在有一个对象,当你查看它时,它不会告诉你存储什么以及它做什么。对于名为“Registry”的类,这可能是合乎逻辑的,但对于名为“Car”的类则不是。

    在记忆方面最有效的方法可能取决于您如何使用对象。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2018-10-22
      • 2015-01-05
      • 2015-04-25
      • 2012-02-04
      • 2017-06-15
      • 2018-06-04
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多