如何根据数据库值动态定义常量?

时间:2014-06-29 15:42:58

标签: php constants software-design

我正在使用PHP& MySQL,但这个问题与语言无关。我有一个应用程序,其中有一个名为类别的db表,其中包含category_idcategory_name

|---------------------|
| Cat ID | Cat Name   |
| --------------------|      
| 1      | Desktop    |
| 2      | Laptop     |
| 3      | Tablet     | 
| 4      | Smart Phone|
|---------------------|   

在代码中我需要在很多地方对这些ID进行比较,所以我将它们定义为常量,所以我知道我在比较什么:

define("DESKTOP",1);
define("LAPTOP",2);
define("TABLET",3);
define("SMARTPHONE",4);

所以现在我用它们像:

if($user_device == SMARTPHONE) 
{
  // do something..
}

随着类别的增加,我必须手动define()。这是通常的做法吗?我可以动态查询表并根据类别名称和ID创建常量列表吗?这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

将项目存储在名为$items的关联数组中,并为该项指定项目名称及其ID。

实施例

$items = array();

// Populate the array from the DB
while(...){
   $items[$db_items['name']] = $db_items['ID'];
}

//Condition
if($user_device == $items['SMARTPHONE']) 
{
  // do something..
}

答案 1 :(得分:2)

当然,只需遍历数据库对象/数组并定义常量。

$categories = mysql_fetch_array( $data );
foreach($categories AS $category)
{ 
    define($category['category_name'],$category['category_id']);
} 

但实际上并不是如何使用常量。无论数据库,甚至应用程序如何,常量都是常量。例如,PI是常数。一英里的英寸数是常数。你使用它的方式应该是变量...

if($user_device == $category['smartphone'])
{
     // do something...;
}

答案 2 :(得分:2)

  

我可以动态查询表并创建基于常量的列表   关于类别名称和ID?

是的,你可以。如果不使用常量,则使用变量。因为常量不会按照in the official PHP documentation所解释的那样改变:

  

常量是简单值的标识符(名称)。 作为名称   建议,在执行脚本期间,该值不能更改   (魔术常数除外,它们实际上不是常数)。 A.   常量是默认情况下区分大小写。按照惯例,不变   标识符总是大写的。

这就是为什么常量被称为常量& 变量被称为变量; 常量 常量& 变量变量

“魔术常数”基本上是系统可控的项目,如__FILE____DIR__。魔术常数的值可以改变,但它们不是由你直接控制,而是反映系统级别的变化。

那说在你的情况下,解决方案来自你的变量命名约定。意思是,有一些关于常数和大气的好处。使它们看起来适合您的代码需求。所以只需将代码更改为大写变量:

$DESKTOP = 1;
$LAPTOP= 2;
$TABLET= 3;
$SMARTPHONE= 4;

或者您可以设置一个名为$special_items的数组,然后设置:

$special_items['DESKTOP'] = 1;
$special_items['LAPTOP'] = 2;
$special_items['TABLET'] = 4;
$special_items['SMARTPHONE'] = 4;

或许如果您希望它们可用于类的范围上下文,那么请执行以下操作:

$this->special_items['DESKTOP'] = 1;
$this->special_items['LAPTOP'] = 2;
$this->special_items['TABLET'] = 4;
$this->special_items['SMARTPHONE'] = 4;