常数或注册类?

时间:2009-11-11 08:38:40

标签: php class constants

我遇到了一个注册表类,我想知道是否要打扰这个或者只是去常量,还是对网站范围的全局变量(例如数据库连接信息,网站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数组的类。与使用常量相比,此代码有任何缺点吗?

3 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:1)

虽然使用registry时可能会有很小的开销,但我建议一个人使用它。

  1. 它可以帮助您调试,因为您有一个共同的位置来获取所有信息。
  2. 它更安全,因为用户无法通过操纵URL来添加自己的值。如果网站空间提供商存储您的网站,register_globals将被关闭,但您无法控制。
  3. 作为替代方案,您可以创建自己的注册表,以便通过定义自己的getter和setter来使其内容更明确。

答案 2 :(得分:0)

通过常数,我假设你的意思是命名变量。

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

缺点是你现在有了一个Object,在查看时它不会告诉你存储的内容和它的作用。如果是一个名为“Registry”的类,这可能是合乎逻辑的,但是对于一个叫做“Car”的东西,它不是。

内存方面,最有效的方法可能取决于您如何使用该对象。